首页 > 解决方案 > 错误:类“字符串”没有实例获取器“令牌”。I/颤振(3268):接收器:“dc9e0de8fa2eaa917657e810db06aad2458e4f65”

问题描述

我已经为这个问题苦苦挣扎了两天。我的社交媒体应用程序应该在登录时保存其状态,这样当您离开应用程序并再次返回时,它应该从主页开始,而不是登录页面。我发现使用 StreamBuilder 和 FutureBuilder 可以做到这一点。我用 FutureBuilder 尝试了一些东西,但我有一些错误。

下面是我的主页的样子:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (BuildContext context) => UserData(),
      child: MaterialApp(
        title: 'Curtain App',
        debugShowCheckedModeBanner: false,
        home: FutureBuilder(          
          future: SharedPreferencesHelper.getPrefs(),
          builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            }
            
            if (snapshot.hasData) {
              Provider.of<UserData>(context).currentUserId =
                  snapshot.data.token;
              return HomeScreen();
            } else {
              return LoginScreen();
            }
          },
        ),
      ),
    );
  }
}

class SharedPreferencesHelper {
  static final String _tokenCode = "token";

  static Future<String> getPrefs() async {
    final SharedPreferences preferences = await SharedPreferences.getInstance();

    return preferences.getString(_tokenCode) ?? "empty";
  }
}

这是我的 LoginPage 提交 btn 代码:

 _submit() async {
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      // logging in the user w/ Firebase
      //AuthService.login(_email, _password);

      var user = await DatabaseService.loginUser(_username, _password);
      final data = json.decode(user);

      SharedPreferences sharedPreferences =
          await SharedPreferences.getInstance();

      print("Hi ${data['username']}");
      print("Status ${data['status']}");
      print("Token ${data['token']}");

      if (data['username'] != null) {
        setState(() {
          _message = "Hi ${data['username']}";
          sharedPreferences.setString('token', data['token']);
        });
        Navigator.of(context).pushAndRemoveUntil(
            CupertinoPageRoute(
              builder: (context) => HomeScreen(),
            ),
            (Route<dynamic> route) => false);
      }
    }
  }

关于如何解决这个问题的任何想法?

标签: fluttersharedpreferencesflutter-futurebuilder

解决方案


只需.token从发生错误的行中删除。snapshot.data已经令牌。


推荐阅读