如何在 ChangeNotifier 中使用 Futures?

Posted

技术标签:

【中文标题】如何在 ChangeNotifier 中使用 Futures?【英文标题】:How to use Futures inside ChangeNotifier? 【发布时间】: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 【参考方案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 中,您不需要再次获取方法

以上是关于如何在 ChangeNotifier 中使用 Futures?的主要内容,如果未能解决你的问题,请参考以下文章

ChangeNotifier 安装等效?

如何在 Navigator 中传递 ChangeNotifier?

我如何从类扩展 ChangeNotifier 中获取价值

如何显示来自 ChangeNotifier 模型的对话框

如何使用 ChangeNotifier & Provide 或 BLOC 从一个地方获取整数值?

如何将计时器添加到 changenotifier 类