在 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

的值