Dart 颤振-如何在非异步方法中从共享首选项中获取值
我试图从类的getter方法中获取保存在Dart 颤振-如何在非异步方法中从共享首选项中获取值,dart,flutter,Dart,Flutter,我试图从类的getter方法中获取保存在SharedReferences中的一些值。但是SharedReferences.getInstance()返回一个Future。是否有一种方法可以在非异步getter方法中获取SharedReferences对象,例如: import 'package:shared_preferences/shared_preferences.dart'; class MyClass { get someValue { return _sharedPref
SharedReferences
中的一些值。但是SharedReferences.getInstance()
返回一个Future
。是否有一种方法可以在非异步
getter方法中获取SharedReferences
对象,例如:
import 'package:shared_preferences/shared_preferences.dart';
class MyClass {
get someValue {
return _sharedPreferencesObject.getString("someKey");
}
}
Dart中是否有类似于C#中的
.Result
属性的内容,例如getSomethingAsync().Result
()?您可以在initState()
中执行此操作,然后在调用setState()
后更新build()
方法。另一种方法是使用FutureBuilder()
您可以使用
FutureBuilder()
SharedReferences SharedRefers;
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:_getPrefs(),
生成器:(上下文,快照){
if(snapshot.hasData){
返回finalwidget();
}
返回CircularProgressIndicator();//或其他一些小部件
},
);
}
Future\u getPrefs()异步{
sharedPrefs=等待SharedPreferences.getInstance();
}
您可以调用initState()
上的函数并将SharedReferences保存在变量中,这样您就可以在非异步方法中使用,如下所示:
SharedPreferences prefs;
Future<void> loadPrefs() async {
prefs = await SharedPreferences.getInstance();
}
@override
void initState(){
super.initState();
loadPrefs();
}
SharedReferences优先权;
Future loadPrefs()异步{
prefs=等待SharedReferences.getInstance();
}
@凌驾
void initState(){
super.initState();
loadPrefs();
}
我建议您使用GetStorage
您将能够在不等待的情况下获取值
main.dart
await GetStorage.init();
runApp(MyApp());
static bool isFirstOpen() {
final box = GetStorage();
return box.read("isFirstOpen") ?? true;
}
static setFirstOpen(bool isopen) {
final box = GetStorage();
box.write("isFirstOpen", isopen);
}
存储。省道
await GetStorage.init();
runApp(MyApp());
static bool isFirstOpen() {
final box = GetStorage();
return box.read("isFirstOpen") ?? true;
}
static setFirstOpen(bool isopen) {
final box = GetStorage();
box.write("isFirstOpen", isopen);
}
使用一个
FutureBuilder
可能重复的Hi@CopsOnRoad,我知道这些解决方案,但我的问题更多的是,是否有一种方法可以等待将来的对象以非异步方法返回。我编辑了我的问题以使它更清晰(我希望如此)。@Dean,我不知道您的用例,但最好是在应用程序启动时获得SharedReferences
,然后在需要时使用它。您还可以在应用程序的初始屏幕中实例化它。@CopsOnRoad,这就是我目前正在做的事情。我的问题的答案是“这是不可能的”。我认为这是行不通的,因为异步在这种情况下是行不通的initState@LatheeshVMVillasetState
是在匿名函数中调用的(不是在initState
函数中),因此上述代码可以工作。我不介意投反对票,只要有道理。对不起。也许我错了,只是想理解。等待SharedReferences.getInstance();这是一个异步调用,因此根据文档,initState无法处理其中的异步调用。调用setState没有问题@LatheeshVMVilla我在哪里使用了await
内部initState
?您的代码中没有await调用,这就是为什么我觉得它不正确的原因。SharedReferences prefs=等待SharedReferences.getInstance();