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调用函数的地方。
目标:函数返回解密后的字符串,主线程需要等待数据可用。
抱歉不够具体。我的页面正在加载它自己的线程。在线程中,我想从商店中获取价值。线程无法继续,因为下一条语句取决于存储中的数据。
例如,我需要来自商店的用户名和密码才能登录。用户名和密码是分开存储的。
当然,我可以嵌套“then”语句,但我认为为了源代码的可读性,最好等到从商店读取值。
您永远不应该阻塞主线程,因为它会阻塞应用程序操作。您的初始化可能需要很长时间,如有必要,系统可能会终止您的应用程序。
为了解决你的问题,最好不要阻塞主线程,可以通过创建加载屏幕,等待数据加载完成,并显示最终的应用程序屏幕来完成。
代码原型可能如下所示:
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)
| 归档时间: |
|
| 查看次数: |
10330 次 |
| 最近记录: |