【问题标题】:Error: Class 'String' has no instance getter 'token'. I/flutter ( 3268): Receiver: "dc9e0de8fa2eaa917657e810db06aad2458e4f65"错误:“字符串”类没有实例获取器“令牌”。 I/颤振(3268):接收器:“dc9e0de8fa2eaa917657e810db06aad2458e4f65”
【发布时间】:2021-05-18 12:15:20
【问题描述】:

我已经为这个问题苦苦挣扎了两天。我的社交媒体应用程序应该在登录时保存其状态,以便当您离开应用程序并再次返回时,它应该从主页开始,而不是登录页面。我发现使用 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);
      }
    }
  }

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

【问题讨论】:

    标签: flutter sharedpreferences flutter-futurebuilder


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2020-02-12
      • 1970-01-01
      • 2020-09-24
      • 2021-10-28
      • 1970-01-01
      • 2012-11-23
      • 2022-06-29
      • 2021-01-20
      相关资源
      最近更新 更多