如何在 ChangeNotifier 中使用 Futures?

UVi*_*Vic 2 sqlite dart flutter flutter-provider

我有一个sqlite从中读取数据的数据库。我也有一个很长的小部件树。所以经过一番研究,我找到了providerFlutter 包。但是我不知道如何在扩展类中使用 FuturesChangeNotifier或如何在我的小部件树中的任何地方使用它?

class MyProvider with ChangeNotifier {
  dynamic _myValue;

  dynamic get myValue => _myValue;

  set myValue(dynamic newValue) {
    _myValue = newValue;
    notifyListeners();
  }

  MyProvider(){
    loadValue();
  }

  Future<void> loadValue async {
    myValue = await db.instance().getValue();
  }

  Future<void> refetch async {
    myValue = await db.instance().newValue();
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 9

我建议你先去了解 Futures 和 Provider 包是如何工作的。您可以使用 .then() 方法直接在您的小部件树中等待 Future 完成,或者您可以像这样在提供程序中处理它:

class MyProvider with ChangeNotifier {
  dynamic _myValue;

  dynamic get myValue => _myValue;

  set myValue(dynamic newValue) {
    _myValue = newValue;
    notifyListeners();
  }

  MyProvider(){
    loadValue();
  }

  Future<void> loadValue async {
   myValue = await db.instance().getValue();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的小部件树中:

build(context) {
  return ChangeNotifierProvider.value(
    value: MyProvider(),
    child: Consumer<MyProvider>(builder:
      (BuildContext context, MyProvider provider, Widget child) {
       if(provider.myValue == null) {
         return Center(
            child: CircularProgressIndicator(),
         );
       } else {
          return Container(
            child: Text(provider.myValue);
          );
       }
    }
  );
}
Run Code Online (Sandbox Code Playgroud)

这只是一种方法,但还有很多其他方法可以解决这个问题。