Flutter Riverpod-组合提供程序时出现问题
我正在尝试使用Riverpod状态管理合并提供商。在这个场景中,我创建了一个视图模型,其中包含一个从该视图模型类检索未来的函数。当我尝试从VM加载国家/地区数据时,显示以下错误: “'package:flatter\u hooks/src/framework.dart':失败的断言:第489行位置7:'!\u debugIsInitHook':无法侦听HookState.initState内的继承小部件。请改用HookState.build” 测试屏幕代码:Flutter Riverpod-组合提供程序时出现问题,flutter,dart,riverpod,Flutter,Dart,Riverpod,我正在尝试使用Riverpod状态管理合并提供商。在这个场景中,我创建了一个视图模型,其中包含一个从该视图模型类检索未来的函数。当我尝试从VM加载国家/地区数据时,显示以下错误: “'package:flatter\u hooks/src/framework.dart':失败的断言:第489行位置7:'!\u debugIsInitHook':无法侦听HookState.initState内的继承小部件。请改用HookState.build” 测试屏幕代码: var viewModel =
var viewModel =
Provider<TestViewModel>((ref) => TestViewModel(ref.read));
var countryProvider = FutureProvider<Country>((ref) {
var vm = ref.watch(viewModel);
return vm.getCountryData();
});
class TestScreen extends HookWidget {
@override
Widget build(BuildContext context) {
var country = useProvider(countryProvider);
return Scaffold(
appBar: AppBar(title: 'Test'),
body: country.when(
loading: () => Container(),
error: (err, stack) => Center(child: Text(err.toString())),
data: (country) => Center(child: Text("Success")),
),
);
}
}
var视图模型=
提供者((ref)=>TestViewModel(ref.read));
var countryProvider=FutureProvider((参考){
var vm=ref.watch(视图模型);
返回vm.getCountryData();
});
类TestScreen扩展了Widget{
@凌驾
小部件构建(构建上下文){
var country=useProvider(countryProvider);
返回脚手架(
appBar:appBar(标题:“测试”),
身体:国家。什么时候(
正在加载:()=>Container(),
错误:(err,stack)=>Center(子项:Text(err.toString()),
数据:(国家)=>中心(子项:文本(“成功”)),
),
);
}
}
TestViewModel代码:
class TestViewModel {
final Reader read;
SessionRepository _session;
Destination get dest => _session.destination;
TestViewModel (this.read) : _session = read(sessionProvider);
// A function that returns a Future
Future<Country> getCountryData() => Country.getData(dest.countryName);
}
类TestViewModel{
最终读者阅读;
SessionRepository_会话;
Destination get dest=>\u session.Destination;
TestViewModel(this.read):\u session=read(sessionProvider);
//返回未来的函数
Future getCountryData()=>Country.getData(dest.countryName);
}
也许您可以尝试这样实现它
class Home extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: 'Test'),
body: TestScreen();
);
}
}
class TestScreen extends HookWidget {
@override
Widget build(BuildContext context) {
return useProvider(countryProvider).when(
loading: () => Container(),
error: (err, stack) => Center(child: Text(err.toString())),
data: (country) => Center(child: Text("Success")),
);
}
}
通过这种方式,钩子可以重建小部件,而不会显示尝试侦听initState中的更改时出现的错误谢谢,这已经解决了问题,但您能详细说明我做错了什么吗?我不完全确定,我的理论是,通过传递country.when()在脚手架内返回一个小部件,小部件在重建时试图使用上下文,这导致了问题