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

Dea*_*ean 18 dart flutter

我试图SharedPreferences从类的 getter 方法中获取一些保存在 中的值。但SharedPreferences.getInstance()返回一个Future. 有没有办法SharedPreferences在非asyncgetter 方法中获取对象,例如:

import 'package:shared_preferences/shared_preferences.dart';

class MyClass {
  get someValue {
    return _sharedPreferencesObject.getString("someKey");
  } 
}
Run Code Online (Sandbox Code Playgroud)

Dart 中是否有类似于.ResultC# 中的属性的东西,例如getSomethingAsync().Resulthttps://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1.result?view=netframework- 4.7.2 )?

Cop*_*oad 20

您可以使用 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();
}
Run Code Online (Sandbox Code Playgroud)


Cop*_*oad 15

您可以initState()在此调用中和之后执行此操作setState()以更新您的build()方法。另一种方法是使用FutureBuilder()

SharedPreferences sharedPrefs;

@override
void initState() {
  super.initState();
  SharedPreferences.getInstance().then((prefs) {
    setState(() => sharedPrefs = prefs);
  });
}
Run Code Online (Sandbox Code Playgroud)


yem*_*int 8

我建议你使用GetStorage

https://pub.dev/packages/get_storage

您无需等待即可获得价值

主程序.dart

await GetStorage.init();
runApp(MyApp());



Run Code Online (Sandbox Code Playgroud)

存储.dart

  static bool isFirstOpen() {
    final box = GetStorage();
    return box.read("isFirstOpen") ?? true;
  }

  static  setFirstOpen(bool isopen) {
    final box = GetStorage();
    box.write("isFirstOpen", isopen);
  }
Run Code Online (Sandbox Code Playgroud)