Flutter Riverpod-组合提供程序时出现问题

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 =

我正在尝试使用Riverpod状态管理合并提供商。在这个场景中,我创建了一个视图模型,其中包含一个从该视图模型类检索未来的函数。当我尝试从VM加载国家/地区数据时,显示以下错误:

“'package:flatter\u hooks/src/framework.dart':失败的断言:第489行位置7:'!\u debugIsInitHook':无法侦听HookState.initState内的继承小部件。请改用HookState.build”

测试屏幕代码:

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()在脚手架内返回一个小部件,小部件在重建时试图使用上下文,这导致了问题