Flutter,函数需要等待数据可用

use*_*673 3 asynchronous synchronous wait flutter

我是颤振编程的新手。我试图理解异步函数调用,但偏离了轨道。

我想以安全的方式在我的设备上存储数据。因此,在写入数据时,数据将被加密,而在读取数据时,数据将被解密。应用程序不知道数据已在设备上加密。
我制作了一个使用 SharedPreferences 库的 Storage 类。
读取功能的第二个功能是应用程序将等待数据可用。

我写了这样的东西

  static String getString(String key)  {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    return _decrypt(prefs.getString(key));   
  }
Run Code Online (Sandbox Code Playgroud)

现在编译器抱怨 await 语句不是预期的。

当我将函数更改为返回 a 的异步函数时Future,它可以工作。但是我的等待问题向上移动到getString调用函数的地方。
目标:函数返回解密后的字符串,主线程需要等待数据可用。

从 OP 的一个答案中添加,应该是一个编辑:

抱歉不够具体。我的页面正在加载它自己的线程。在线程中,我想从商店中获取价值。线程无法继续,因为下一条语句取决于存储中的数据。

例如,我需要来自商店的用户名和密码才能登录。用户名和密码是分开存储的。

当然,我可以嵌套“then”语句,但我认为为了源代码的可读性,最好等到从商店读取值。

Pet*_*ton 8

您永远不应该阻塞主线程,因为它会阻塞应用程序操作。您的初始化可能需要很长时间,如有必要,系统可能会终止您的应用程序。

为了解决你的问题,最好不要阻塞主线程,可以通过创建加载屏幕,等待数据加载完成,并显示最终的应用程序屏幕来完成。

代码原型可能如下所示:

class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => HomePageState();
}

class HomePageState extends State<HomePage> {
  String data;

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

    loadData().then((data) {
      setState(() {
        this.data = data; 
      });
    });
  }

  Future loadData() async {    
    data = 'xxx'; // load your data from SharedPreferences
    return data;    
  }

  @override
  Widget build(BuildContext context) {
    if (data == null) {
      loadData();
      return LoadingScreen();
    } else {
      return MainScreen();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)