SharedPreferences 值混淆

时间:2021-03-26 15:02:46

标签: flutter dart

我创建了一个移动应用程序。主页欢迎用户。主页上有一个编辑按钮和一个登录按钮。我不使用登录页面。我从 URL、用户名和密码编辑页面获取此信息,并使用主页上的 SharedPreferences 获取此信息并获取令牌。使用我得到的令牌,我按下登录按钮以获取我想要的数据。系统工作。但有时我会遇到问题。我输入用户的信息,当我按下登录按钮时,我得到了我想要的信息。但是当我更改用户信息时,旧令牌和新令牌有时会混淆。每次按登录键,这两个用户的信息都是随机显示的。我只想购买带有最后输入信息的代币并使用该代币接收数据。没有错误返回。 我想解决这个问题。我尝试了我在网站上找到的所有内容。但无法解决问题。

  class MyApp extends StatefulWidget {
      @override
      _State createState() => _State();
    }

class _State extends State<MyApp> {
  String username = '';
  String password = '';
  String url = '';
  String token = '';

  Future<void> getToken() async {
    //...Some Information
    Map parsed = new Map();
    http
        .post(oauthUrl,
            body: map, headers: <String, String>{'authorization': basicAuth})
        .then((resp) => {
              parsed = json.decode(resp.body),
              setState(() {
                this.token = parsed["access_token"];
                _setToken(parsed["access_token"]);
              })
            })
        .catchError((err) => {this.token = "error"});
  }

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _getUsername().then((v) {
        setState(() {
          username = v;
        });
      });
    });
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _getPassword().then((v) {
        setState(() {
          password = v;
        });
      });
    });
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await _getUrl().then((v) {
        setState(() {
          url = v;
        });
      });
    });
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await this.getToken();
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    getToken();
    return Scaffold(
        appBar: AppBar(
          title: Text('My App'),
          centerTitle: true,
          backgroundColor: Colors.grey,
        ),
        body: Padding(
            padding: EdgeInsets.all(10),
            child: ListView(
              children: <Widget>[
                Container(
                    child: Image.asset(
                  'images/my_logo.png',
                  height: 300,
                )),
                Container(
                  alignment: Alignment.center,
                  padding: EdgeInsets.all(10),
                  child: Text(username ?? 'username not found.',
                      style: TextStyle(color: Colors.black, fontSize: 16)),
                ),
                SizedBox(
                  height: 20,
                  width: 20,
                ),
                Container(
                    height: 35,
                    padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
                    child: ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          primary: Colors.grey,
                        ),
                        child: Text('Login'),
                        onPressed: () {
                          getToken();
                          Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => getData()),

                          );
                        })),
                SizedBox(width: 20, height: 20),
                Container(
                    height: 35,
                    padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
                    child: RaisedButton(
                        child: Text('User Infos'),
                        onPressed: () {
                          Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => ThirdRoute()),
                          );
                        })),
              ],
            )));
  }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

  1. 如果您使用 SharedPreferences 并且每次更改/分配某些值时,请在 setState() 函数中进行。在一般用法中,使用有状态小部件最适合此操作。您可以使用虚拟变量在 setState() 中进行更改,然后您的小部件会使用您的真实异步数据重建。
  2. 使用缓冲页面(如加载页面),给你足够的时间来获取异步函数的值。在构建小部件之前,我为缓冲区值创建了一个加载页面。