我目前正在使用新的Riverpod语法,但我遇到了一个错误,并且还没有找到解决方案.我需要传递一个依赖项,但它给出了这个错误The class TaskHomeInit must have a default constructor.有谁知道将HomeRepository依赖项传递给它的另一种方法.当我没有放置构造函数时,错误是它需要被初始化.

@Riverpod(keepAlive: true)
class TaskHomeInit extends _$TaskHomeInit {
  final HomeRepository homeRepository;
  // Constructor
  TaskHomeInit({required this.homeRepository}); // here is error
  @override
  Future<TasksHomeState> build() async {
    final List<TaskHome> taskHome = await homeRepository.getTaskHome();
    return TasksHomeState(isLoading: false, tasksHome: taskHome);
  }
}

当我不创建构造函数时,我得到这个错误:The final variable 'homeRepository' must be initialized. Try initializing the variable.

HomeRepository abstract class

abstract class HomeRepository {
  Future<List<TaskHome>> getTaskHome();
}

Implementation HomeRepository

class HomeRepositoryImpl extends HomeRepository {
  final HomeDatasource datasource;
  HomeRepositoryImpl(this.datasource);
  @override
  Future<List<TaskHome>> getTaskHome() async {
    final test =  await datasource.getTaskHome();
    return test;
  }
}

推荐答案

在Riverpod世界中,依赖项注入通常使用Ref对象完成. 创建一个提供程序,而不是通过构造函数注入依赖项.

@Riverpod(keepAlive: true)
HomeRepository homeRepo(HomeRepoRef ref) => HomeRepositoryImpl(ref.watch(homeDatasourceProvider);

@Riverpod(keepAlive: true)
HomeDatasource homeDatasource(HomeDatasourceRef ref) => HomeDatasourceImpl();

Notifier/AsyncNotifier‘S的Build方法中,使用ref.watch访问依赖项.这是安全的,建议在Build方法中使用ref.watch.

@override
Future<TasksHomeState> build() async {
  final repo = ref.watch(homeRepoProvider);
  final taskHome = await repo.getTaskHome();
  return ...
}

Flutter相关问答推荐

Flutter在创建时为提供者调用初始化函数

Flutter Go路由深度链接不按预期工作

如何在应用程序启动时解析和加载JSON文件?

自定义ItemBuilderFlutter

允许冻结在初始化时使用工厂

Flutter 翼doctor 显示的错误,我似乎不能修复.问题:系统32、Android工具链、Windows 10 SDK

出现异常.RangeError(RangeError(index):无效值:有效值范围为空:0).分度误差

如何使页面浏览量达到活动页面所要求的高度?

如果我使用搜索栏,如何在嵌套滚动视图中停止自动滚动?

如何在flutter中更改showModalBottomSheet小部件中CheckboxListTile小部件的值?

Riverpod 2.3.6:AutoDisposeNotifier和ref.onDispose自动处理

升级到 Flutter 3.10 后,Flutter 键盘填充不起作用. Flutter 3.10 如何防止 BottomSheet 被键盘覆盖?

Flutter - 如何将按钮对齐到行的右侧

如何让小部件根据小部件的大小构建不同的布局?

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

如何在 Flutter 中滚动时为多个小部件设置动画

扩展磁贴尾随图标在与一个磁贴交互时更新列表中的所有内容.如何只更改展开图块的图标?

Flutter 如何要求用户在应用程序中设置电话密码?

Flutter 中的无效日期格式 2022 年 11 月 14 日

在flutter web中重新加载页面时保留一些状态数据的有效方法是什么?