0

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

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

我在 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) {.......
4

1 回答 1

0

您可以通过多种方式实现。它的要点是你应该坚持反应性原则,而不是试图等待改变。例如,您可以在 ajax 请求更改时更改 DataSource 类中布尔值的状态

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
    }
  }
于 2020-10-06T10:14:10.923 回答