在 Flutter 中使用 Sharedpreferences 来处理不同路由之间的数据?
Use Shared Preferences in Flutter to data between differente route?
我有一个让我抓狂的小问题。我在我的 Flutter 应用程序中创建了一个 First Time Open 部分,它由我的 SharedPreferences 中的一个标志控制,如下所示:
Future<void> main() async{
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences preferences = await SharedPreferences.getInstance();
initScreen = preferences.getInt('initScreen');
if (initScreen == 0 || initScreen == null) {
await preferences.setInt('initScreen', 1);
await preferences.setString('email', "");
await preferences.setString('firstName', "");
await preferences.setString('lastName', "");
await preferences.setString('phoneNumber', "");
await preferences.setString('address', "");
}
runApp(MyApp());
}
/*
void main() {
runApp(MyApp());
}
*/
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'My Title',
theme: theme(),
//initialRoute: SplashScreen.routeName,
initialRoute: initScreen == 0 || initScreen == null ? '/splash' : '/dashboard',
routes: routes,
);
}
}
在我要展示的第一部分中有 Login/Register 表格。因此,当用户插入他们的 istances 时,我想将其保存在我的 SharedPreference 中:
class _SignFormState extends State<SignForm> {
...
String email;
SharedPreferences preferences;
Future<void> initSharedPreferences() async{
preferences = await SharedPreferences.getInstance();
}
Future<void> setEmail(String value) async{
preferences.setString('email', value);
}
Future<void> setInitScreenState(int value) async{
preferences.setInt('initScreen', value);
}
...
DefaultButton(
text: "Continue",
press: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
// If all are valid then go to success screen
setEmail(email);
setInitScreenState(1);
Navigator.pushNamed(context, LoginSuccessScreen.routeName);
}
},
),
然后在仪表板中我想显示例如在预览路线中插入的电子邮件,或者当用户离开并关闭我的应用程序后重新打开它时。
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
int initScreen;
String email;
SharedPreferences preferences;
Future<void> initSharedPreferences() async{
preferences = await SharedPreferences.getInstance();
}
Future<void> getSharedPreferences() async{
initScreen = await preferences.getInt('initScreen') ?? 0;
email = await preferences.getString('email') ?? 'Email not found';
}
@override
void initState() {
initSharedPreferences();
super.initState();
}
@override
Widget build(BuildContext context) {
getSharedPreferences();
return SingleChildScrollView(
child: Center(
child: Padding(
padding: EdgeInsets.all(kDefaultPadding),
child: Column(
children: [
Text("Dashboard temp.\n"),
Text("$initScreen"),
Text("$email"),
SizedBox(height: kDefaultPadding,),
MaterialButton(
child: Text("Logout", style: TextStyle(color: kWhiteColor, fontSize: 18),),
onPressed: () {},
height: kDefaultPadding,
color: kPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: kDefaultPadding, vertical: 10.0),
),
],
),
),
),
);
}
}
但是没用。和函数“preferences.getInt('initScreen') ?? 0;”或“preferences.getString('email') ?? 'Email not found';”总是得到我的空错误。
[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: NoSuchMethodError: The method 'getInt' was called on null.
Receiver: null
Tried calling: getInt()
非常感谢您阅读这个问题,如果您发表评论。祝你有美好的一天
这是因为您的函数 initSharedPreferences() 是一个未来函数,当调用 getSharedPreferences() 时它尚未解析。
尝试在 getSharedPreferences() 中获取 sharedPreferences 实例,并使用 setState() 更新 email
的值
我有一个让我抓狂的小问题。我在我的 Flutter 应用程序中创建了一个 First Time Open 部分,它由我的 SharedPreferences 中的一个标志控制,如下所示:
Future<void> main() async{
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences preferences = await SharedPreferences.getInstance();
initScreen = preferences.getInt('initScreen');
if (initScreen == 0 || initScreen == null) {
await preferences.setInt('initScreen', 1);
await preferences.setString('email', "");
await preferences.setString('firstName', "");
await preferences.setString('lastName', "");
await preferences.setString('phoneNumber', "");
await preferences.setString('address', "");
}
runApp(MyApp());
}
/*
void main() {
runApp(MyApp());
}
*/
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'My Title',
theme: theme(),
//initialRoute: SplashScreen.routeName,
initialRoute: initScreen == 0 || initScreen == null ? '/splash' : '/dashboard',
routes: routes,
);
}
}
在我要展示的第一部分中有 Login/Register 表格。因此,当用户插入他们的 istances 时,我想将其保存在我的 SharedPreference 中:
class _SignFormState extends State<SignForm> {
...
String email;
SharedPreferences preferences;
Future<void> initSharedPreferences() async{
preferences = await SharedPreferences.getInstance();
}
Future<void> setEmail(String value) async{
preferences.setString('email', value);
}
Future<void> setInitScreenState(int value) async{
preferences.setInt('initScreen', value);
}
...
DefaultButton(
text: "Continue",
press: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
// If all are valid then go to success screen
setEmail(email);
setInitScreenState(1);
Navigator.pushNamed(context, LoginSuccessScreen.routeName);
}
},
),
然后在仪表板中我想显示例如在预览路线中插入的电子邮件,或者当用户离开并关闭我的应用程序后重新打开它时。
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
int initScreen;
String email;
SharedPreferences preferences;
Future<void> initSharedPreferences() async{
preferences = await SharedPreferences.getInstance();
}
Future<void> getSharedPreferences() async{
initScreen = await preferences.getInt('initScreen') ?? 0;
email = await preferences.getString('email') ?? 'Email not found';
}
@override
void initState() {
initSharedPreferences();
super.initState();
}
@override
Widget build(BuildContext context) {
getSharedPreferences();
return SingleChildScrollView(
child: Center(
child: Padding(
padding: EdgeInsets.all(kDefaultPadding),
child: Column(
children: [
Text("Dashboard temp.\n"),
Text("$initScreen"),
Text("$email"),
SizedBox(height: kDefaultPadding,),
MaterialButton(
child: Text("Logout", style: TextStyle(color: kWhiteColor, fontSize: 18),),
onPressed: () {},
height: kDefaultPadding,
color: kPrimaryColor,
padding: EdgeInsets.symmetric(horizontal: kDefaultPadding, vertical: 10.0),
),
],
),
),
),
);
}
}
但是没用。和函数“preferences.getInt('initScreen') ?? 0;”或“preferences.getString('email') ?? 'Email not found';”总是得到我的空错误。
[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: NoSuchMethodError: The method 'getInt' was called on null.
Receiver: null
Tried calling: getInt()
非常感谢您阅读这个问题,如果您发表评论。祝你有美好的一天
这是因为您的函数 initSharedPreferences() 是一个未来函数,当调用 getSharedPreferences() 时它尚未解析。 尝试在 getSharedPreferences() 中获取 sharedPreferences 实例,并使用 setState() 更新 email
的值