我正在尝试从类的 getter 方法获取保存在SharedPreferences
中的一些值。但是SharedPreferences.getInstance()
返回了一个Future
.有没有办法在非async
getter方法中获取SharedPreferences
对象,例如:
import 'package:shared_preferences/shared_preferences.dart';
class MyClass {
get someValue {
return _sharedPreferencesObject.getString("someKey");
}
}
Dart 中是否有类似于 C# .Result
属性的内容,例如 getSomethingAsync().Result
(https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=netframework-4.7.2(?
FutureBuilder()
late final SharedPreferences _prefs;
late final _prefsFuture = SharedPreferences.getInstance().then((v) => _prefs = v);
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _prefsFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
return YourFinalWidget(); // `_prefs` is ready for use.
}
// `_prefs` is not ready yet, show loading bar till then.
return CircularProgressIndicator();
},
),
);
}
您可以在 initState()
中执行此操作,并在此调用后setState()
更新您的 build()
方法。另一种方法是使用FutureBuilder()
SharedPreferences sharedPrefs;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((prefs) {
setState(() => sharedPrefs = prefs);
});
}
我建议你使用GetStorage
https://pub.dev/packages/get_storage
您将能够在不等待值的情况下获取值
主飞镖
await GetStorage.init();
runApp(MyApp());
存储.dart
static bool isFirstOpen() {
final box = GetStorage();
return box.read("isFirstOpen") ?? true;
}
static setFirstOpen(bool isopen) {
final box = GetStorage();
box.write("isFirstOpen", isopen);
}
SharedPreferences 中唯一的异步调用是获取初始实例。这可以在整个应用程序中重用。 main
可以async
.因此,您只需在main
中await
SharedPreferences
实例:
late SharedPreferences prefs;
main() async {
prefs = await SharedPreferences.getInstance();
runApp(App());
}
现在,您可以在任何地方使用prefs
,而无需求助于async
代码。 SharedPreferences
将用作非阻塞直写缓存,写入操作在后台异步运行。
你可以做这样的事情
- 创建单独的共享首选项服务
- 在构造函数中获取
SharedPreferences
值 - 然后,您可以在没有异步的情况下接听电话,等待
例
class SharedPreferencesService {
final SharedPreferences _prefs;
const SharedPreferencesService(this._prefs);
Future<void> setString(String key, String value) async {
await _prefs.setString(key, value);
}
String? getString(String key) {
if (containsKey(key)) {
return _prefs.getString(key);
} else {
return null;
}
}
bool containsKey(String key) {
return _prefs.containsKey(key);
}
}
您可以在initState()
上调用函数并将 SharedPreferences 保存在变量中,因此您可以在非异步方法中使用,如下所示:
SharedPreferences prefs;
Future<void> loadPrefs() async {
prefs = await SharedPreferences.getInstance();
}
@override
void initState(){
super.initState();
loadPrefs();
}