【问题标题】:Riverpod - Problem when combining providersRiverpod - 合并提供商时出现问题
【发布时间】:2021-02-26 23:41:34
【问题描述】:

我正在尝试使用 Riverpod 状态管理来合并提供程序。在这种情况下,我正在创建一个视图模型,其中包含一个从该视图模型类中检索未来的函数。当我尝试从虚拟机加载国家数据时,显示以下错误:

“'package:flutter_hooks/src/framework.dart': 断言失败: 第 489 行 pos 7: '!_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")),
      ),
    );
  }
}

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);
}

【问题讨论】:

    标签: flutter dart riverpod


    【解决方案1】:

    也许你可以尝试这样实现它

    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")),
        );
      }
    }
    

    这样 Hook 可以重建小部件,而不会显示尝试监听 initState 变化的错误

    【讨论】:

    • 谢谢,这解决了它,但你能详细说明我做错了什么吗?
    • 我不完全确定,我的理论是通过传递 country.when() 并在脚手架内返回一个小部件,小部件在重建时试图使用上下文,这会导致问题
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2022-11-11
    • 2020-12-04
    • 2011-10-30
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多