如何在ChangeNotifier中使用期货?

时间:2019-07-08 14:31:34

标签: flutter

我有一个sqlite数据库,可以从中读取数据。我也有一个长长的小部件树。因此,经过一番研究,我发现了provider抖动包。但是我无法弄清楚如何在扩展ChangeNotifier的类中使用Futures或如何在窗口小部件树的任何位置使用它?

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

}

1 个答案:

答案 0 :(得分:1)

我建议您先了解一下Future和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();
  }
}

然后在小部件树中:

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

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