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

noj0wjuj  于 2023-02-16  发布在  Flutter
关注(0)|答案(6)|浏览(141)

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

wooyq4lh

wooyq4lh1#

您可以使用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();
}
qv7cva1a

qv7cva1a2#

你可以在initState()中完成,然后调用setState()来更新你的build()方法。

SharedPreferences sharedPrefs;

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

eit6fx6z3#

我建议您使用GetStorage

    • 一个

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

    • 主省道**
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);
  }
rta7y2nd

rta7y2nd4#

你可以做这样的事

  • 创建单独的共享首选项服务
  • 在构造函数中接受SharedPreferences
  • 然后,您可以在没有异步的情况下执行get call,wait

示例

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);
  }
}
bbmckpt7

bbmckpt75#

SharedPreferences中唯一的异步调用是获取初始示例,这可以在整个应用中重用。main可以是async。因此,您可以在main中只使用awaitSharedPreferences示例:

late SharedPreferences prefs;

main() async {
  prefs = await SharedPreferences.getInstance();
  runApp(App());
}

现在,您可以在任何地方使用prefs,而无需求助于async代码。SharedPreferences将用作非阻塞直写缓存,写操作在后台异步运行。

wf82jlnq

wf82jlnq6#

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

SharedPreferences prefs;

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

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

相关问题