颤振 - 如何在非异步方法中从共享首选项中获取值



我正在尝试从类的 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.因此,您只需在mainawait 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();
}

最新更新