Flutter-如何通过非异步方法从共享的首选项中获取价值

时间:2019-03-28 15:59:01

标签: dart flutter

我正在尝试从类的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)?

5 个答案:

答案 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

无需等待即可获取值

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 :(得分:-1)

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

SharedPreferences prefs;

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

@override
void initState(){
  super.initState();
  loadPrefs();
}