我正在尝试从类的getter方法中保存一些保存在SharedPreferences.getInstance()
中的值。但是Future
返回一个SharedPreferences
。是否可以通过非async
的getter方法获取import 'package:shared_preferences/shared_preferences.dart';
class MyClass {
get someValue {
return _sharedPreferencesObject.getString("someKey");
}
}
对象,例如:
.Result
Dart中是否存在类似于C#中的getSomethingAsync().Result
属性的东西,例如{{1}}(https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=netframework-4.7.2)?
答案 0 :(得分:2)
您可以在initState()
中执行此操作,然后在调用setState()
之后更新您的build()
方法。另一种方法是使用FutureBuilder()
SharedPreferences sharedPrefs;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((prefs) {
setState(() => sharedPrefs = prefs);
});
}
答案 1 :(得分:1)
您可以使用FutureBuilder()
SharedPreferences sharedPrefs;
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getPrefs(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return YourFinalWidget();
}
return CircularProgressIndicator(); // or some other widget
},
);
}
Future<void> _getPrefs() async{
sharedPrefs = await SharedPreferences.getInstance();
}
答案 2 :(得分:1)
我相信Dart当前不支持与C#中的.Result
等效的功能。解决方法是使用FutureBuilder
或在initState()
方法中注入对象,如其他答案所述。
答案 3 :(得分:1)
我建议你使用 GetStorage
https://pub.dev/packages/get_storage
无需等待即可获取值
main.dart
await GetStorage.init();
runApp(MyApp());
storage.dart
static bool isFirstOpen() {
final box = GetStorage();
return box.read("isFirstOpen") ?? true;
}
static setFirstOpen(bool isopen) {
final box = GetStorage();
box.write("isFirstOpen", isopen);
}
答案 4 :(得分:-1)
您可以在 initState()
上调用函数并将 SharedPreferences 保存在变量中,以便您可以在非异步方法中使用,如下所示:
SharedPreferences prefs;
Future<void> loadPrefs() async {
prefs = await SharedPreferences.getInstance();
}
@override
void initState(){
super.initState();
loadPrefs();
}