如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Navigator 中传递 ChangeNotifier?