【问题标题】:Use Shared Preferences in Flutter to data between differente route?在 Flutter 中使用 Sharedpreferences 来处理不同路由之间的数据?
【发布时间】:2021-02-25 09:55:48
【问题描述】:

我有一个小问题让我发疯。我在我的 Flutter 应用程序中创建了一个首次打开部分,该部分由我的 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,
    );
  }
}

在我想展示的第一次部分有登录/注册表格。因此,当用户插入他们的实例时,我想将其保存在我的 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()

非常感谢您阅读此问题并发表评论。祝你有美好的一天

【问题讨论】:

    标签: android flutter dart mobile sharedpreferences


    【解决方案1】:

    这是因为你的函数 initSharedPreferences() 是一个未来,当 getSharedPreferences() 被调用时它还没有解决。 尝试在 getSharedPreferences() 中获取 sharedPreferences 实例,并使用 setState() 更新 email 的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2022-11-08
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多