Flutter 从数据库中获取状态对象

Flutter 从数据库中获取状态对象,flutter,flutter-provider,Flutter,Flutter Provider,我想在启动时从数据库中获取我的状态。我在第一个小部件中使用带有ChangeNotivierProvider的provider。包括用于澄清的代码 这是我的主要方法,它有一个小部件,提供我计划在应用程序中使用的状态: void main() => runApp( ChangeNotifierProvider( child: MyApp(), builder: (context) => StateDao.get(), ),

我想在启动时从数据库中获取我的状态。我在第一个小部件中使用带有ChangeNotivierProvider的provider。包括用于澄清的代码

这是我的主要方法,它有一个小部件,提供我计划在应用程序中使用的状态:

void main() => runApp(
    ChangeNotifierProvider(
            child: MyApp(),
            builder: (context) => StateDao.get(),
    ),
}
我的DAO只是从数据库返回状态(我使用sembast,但也可以是sqflite或Firebase)


这将不起作用,因为我无法在ChangeNotifierProvider的生成器方法中调用异步方法。如何、何时以及在何处初始化?据我所知,异步调用不应该在任何构建方法中进行。我尝试重写提供上下文访问的didChangeDependencies,但无法通过生成器方法中的异步调用限制。

您可以在initState中初始化该值。例如,您可以存储Future对象,并在解析值时使用FutureBuilder构建小部件:

未来状态;
@凌驾
void initState(){
//调用异步方法并存储未来对象
futureState=StateDao.get();
super.initState();
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:未来国家,
生成器:(上下文,快照){
//还没有数据,显示加载程序
如果(!snapshot.hasData){
返回循环ProgressIndicator();
}
返回ChangeNotifierProvider(
子项:MyApp(),
生成器:(上下文)=>snapshot.data,
);
},
);
}
另一种类似的方法是使用StreamController和StreamBuilder:

final StreamController stateStream=StreamController();
@凌驾
void initState(){
//调用async方法并设置回调以向流中添加数据
StateDao.get().then((v)=>stateStream.add(v));
super.initState();
}
@凌驾
无效处置(){
//关闭水槽
stateStream.close();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
stream:stateStream.stream,
生成器:(上下文,快照){
//还没有数据,显示加载程序
如果(!snapshot.hasData){
返回循环ProgressIndicator();
}
返回ChangeNotifierProvider(
子项:MyApp(),
生成器:(上下文)=>snapshot.data,
);
},
);
}
若你们需要更复杂的架构,你们可能想看看BLoC,它是颤振社区中非常流行的架构

Future<State> get() async { 
    // Database logic
}
class State extends ChangeNotifier {
    // Getters, setters, changeNotifiers etc.
}