我是扑扑编程的新手。我正在尝试理解异步函数调用,但步入正轨。
我想以安全的方式将数据存储在设备上。因此,在写入数据时,数据将被加密,而在读取数据时,数据将被解密。应用程序不知道数据已在设备上加密。
我制作了一个使用SharedPreferences库的Storage类。
读取功能的第二个功能是,应用程序将等待直到数据可用为止。
我写了这样的东西
static String getString(String key) {
SharedPreferences prefs = await SharedPreferences.getInstance();
return _decrypt(prefs.getString(key));
}
现在,编译器抱怨不需要await语句。
当我将函数更改为异步函数并返回Future时,它将起作用。但是我的等待问题上升到了调用getString函数的地方。
目标:函数应返回解密的String,并且主线程需要等待直到数据可用为止。
欢迎任何帮助
答案 0 :(得分:0)
您必须添加关键字async和Future,如下所示:
static Future<String> getString(String key) async { // ------> here
SharedPreferences prefs = await SharedPreferences.getInstance();
return _decrypt(prefs.getString(key));
}
并且要使用此异步方法,必须按以下方式进行操作:
getString("someKey").then((valueString) => print(valueString));
答案 1 :(得分:0)
永远不要阻塞主线程,因为它会阻塞应用程序操作。初始化可能需要很长时间,并且必要时系统可能会杀死您的应用程序。
要解决您的问题,最好不要阻塞主线程,这可以通过创建加载屏幕,等待数据加载完成并显示最终的应用程序屏幕来完成。
代码原型如下:
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();
}
}
}
答案 2 :(得分:0)
抱歉,不够具体。我的页面正在其自己的线程中加载。在线程中,我想从存储中获取值。该线程无法继续,因为下一条语句取决于存储中的数据。
例如我需要商店中的用户名和密码才能登录。用户名和密码分开存储。
当然,我可以嵌套'then'语句,但是我认为从源代码的可读性出发,最好等到从存储中读取该值。
答案 3 :(得分:0)
Future strUser() async {
SharedPreferences sharedPreferences = await
SharedPreferences.getInstance();
return sharedPreferences.getInt('strUser');
}
init(){
await SharedPreferenceFunction().strUser().then((value) {
setState(() {
this.strUser = value;
});
});
}
答案 4 :(得分:0)
以这种方式调用这里是我的功能& 设置状态为Imp!
y
并调用
checkInCart()async{
bool pre=await storage.containsKey(key: '${widget.eventIndex}');
if(pre) {
setState(() {
isavail=true;
favorite=true;
});
}
}
这必须能正常工作,欢迎使用!