问题描述
我有ChangeNotifierProvider对象,该对象使用数据存储的sqflite资产数据库,该数据库需要在将来的开始时加载。问题在于ChangeNotifierProvider不等待将来的操作完成。我试图添加一种机制来使ChangeNotifierProvider等待,但无法成功。 (尝试使用FutureBuilder,FutureProvider,一起使用等...)
注意:FutureProvider解决了等待的问题,但它不像ChangeNotifierProvider那样侦听对象。当我在multiprovider中使用它们时,我有两个不同的对象实例...
我在StackOverflow或其他站点中找到的所有解决方案均未提供针对此特定问题的一般解决方案或方法。 (或者我找不到)我相信必须有一个非常基本的解决方案/方法,因此决定寻求您的帮助。如何才能对此代码实现将来的功能,或者如何使ChangeNotifierProvider等待将来的功能?
class DataSource with ChangeNotifier {
int _myId;
List _myList;
int get myId => _myId;
List get myList => _myList;
void setMyId(int changeMyId) {
_myId = changeMyId;
notifyListeners();
}
.... same setter code for myList object.
DataSource(){initDatabase();}
Future<bool> initDatabase() {
.... fetching data from asset database. (this code works properly)
return true;
}
}
main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<DataSource>(
create: (context) => DataSource(),child: MaterialApp(
home: HomePage(),),);
}
}
Following code and widgets has this code part (it works fine)
return Consumer<DataSource>(
builder: (context,myDataSource,child) {.......
解决方法
有多种方法可以实现。重点是您应该坚持被动原则,而不要等待更改。举例来说,当ajax请求更改时,您可以在DataSource类中更改布尔值的状态
class DataSource extends ChangeNotifier{
bool isDone = false;
Future<bool> initDatabase(){
//Do Whatever
isDone = true;
notifyListeners();
}
}
然后您可以像这样在build方法中收听此更改
Widget build(BuildContext ctx){
bool isDone = Provider.of<DataSource>(context).isDone;
if(isDone){
// render result
}else{
// maybe render loading
}
}