【问题标题】:Flutter - How to get value from shared preferences in a non-async methodFlutter - 如何以非异步方法从共享偏好中获取价值
【发布时间】:2019-03-28 15:59:00
【问题描述】:

我正在尝试从类的 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://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=netframework-4.7.2)?

【问题讨论】:

  • 嗨@CopsOnRoad,我知道这些解决方案,但我的问题更多是关于是否有办法等待未来对象以非异步方法返回。我编辑了我的问题以使其更清晰(我希望)。
  • @Dean,我不知道你的用例,但好的是在应用程序启动时获得SharedPreferences,然后在需要时使用它。您也可以在应用的启动画面中实例化它。
  • @CopsOnRoad,这就是我目前正在做的事情。我的问题的答案是“不可能”。

标签: dart flutter


【解决方案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】:

    您可以在 initState() 中执行此操作,然后在此调用 setState() 之后更新您的 build() 方法。其他方式是使用FutureBuilder()

    SharedPreferences sharedPrefs;
    
    @override
    void initState() {
      super.initState();
      SharedPreferences.getInstance().then((prefs) {
        setState(() => sharedPrefs = prefs);
      });
    }
    

    【讨论】:

    • 我认为这不会起作用,因为异步在那个 initState 中不起作用
    • @LatheeshVMVilla setState 在匿名函数中调用(不在initState 函数中),所以上面的代码有效。我不介意投反对票,只要它们有意义。
    • 对不起。也许我错了,只是想理解。等待 SharedPreferences.getInstance();这是一个异步调用,因此根据文档 initState 无法处理其中的异步调用。调用setState没有问题。 pub.dev/packages/shared_preferences
    • @LatheeshVMVilla 我在哪里使用 awaitinitState 内?
    • 您的代码中没有 await 调用,这就是我觉得它不正确的原因。 SharedPreferences 首选项 = 等待 SharedPreferences.getInstance();
    【解决方案3】:

    我建议你使用 GetStorage

    https://pub.dev/packages/get_storage

    您将能够获得价值而无需等待它们

    ma​​in.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】:

    您可以在 initState() 上调用函数并将 SharedPreferences 保存在变量中,这样您就可以在非异步方法中使用,如下所示:

    SharedPreferences prefs;
    
    Future<void> loadPrefs() async {
      prefs = await SharedPreferences.getInstance();
    }
    
    @override
    void initState(){
      super.initState();
      loadPrefs();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多