如何为 ChangeNotifierProvider 创建依赖项并使其等待完成?

How to create a dependency for ChangeNotifierProvider and make it wait to complete?

我有 ChangeNotifierProvider 对象,它使用存储在 sqflite 资产数据库中的数据,需要在未来开始时加载。问题是 ChangeNotifierProvider 不会等待未来的操作完成。我试图添加一种机制让 ChangeNotifierProvider 等待,但没有成功。 (尝试了 FutureBuilder、FutureProvider,一起使用等...)

注意:FutureProvider 解决了等待问题,但它不像 ChangeNotifierProvider 那样监听对象。当我在 multiprovider 中使用它们时,我有两个不同的对象实例...

我在 Whosebug 或其他网站上找到的所有解决方案都没有针对此特定问题提供通用解决方案或方法。 (或者我找不到)我相信一定有一个非常基本的 solution/approach 并决定寻求您的帮助。如何为这段代码实现未来,或者如何让 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 中布尔值的状态
class DataSource extends ChangeNotifier{
  bool isDone = false;
  
  Future<bool> initDatabase(){
    //Do Whatever
    
    isDone = true;
    notifyListeners();
  }
}

然后你可以像这样在构建方法中收听这个变化

  Widget build(BuildContext ctx){
    bool isDone = Provider.of<DataSource>(context).isDone;
    
    if(isDone){
      // render result
    }else{
      // maybe render loading
    }
  }