【问题标题】:How to use Futures inside ChangeNotifier?如何在 ChangeNotifier 中使用 Futures?
【发布时间】:2019-11-18 02:25:34
【问题描述】:

我有一个 sqlite 数据库,我从中读取数据。我也有一棵很长的小部件树。所以经过一番研究,我找到了provider Flutter 包。但我不知道如何在扩展 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();
  }
}

【问题讨论】:

  • 我猜你知道如何使用Future

标签: sqlite flutter dart flutter-provider


【解决方案1】:

我建议你先去了解 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();
  }
}

然后在您的小部件树中:

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

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

【讨论】:

  • 将创建一个重新获取功能,就像我在上面编辑的问题中所做的那样有效......???
  • loadData(); 末尾添加notifyListeners(); 现在可以正常工作了
  • 你已经有了 notifyListeners();在 myValue 的 setter 中,您不需要再次获取方法
猜你喜欢
  • 2020-10-13
  • 2020-02-07
  • 2020-05-26
  • 1970-01-01
  • 2020-09-17
  • 2021-04-10
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多