如何理解并解决Riverpod_lint的provider_dependencies报错?
环境搭建
- 创建新项目
- 添加「补充信息」中列出的依赖
- 添加以下文件
- foos.dart
import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'foos.g.dart'; @Riverpod(keepAlive: true) class Foos extends _$Foos { @override List<String> build() => <String>[]; Future<void> initialize() => Future.sync( () => state = [for (var i = 0; i < 100; ++i) 'foo'], ); } - bars.dart
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'foos.dart'; part 'bars.g.dart'; @Riverpod(keepAlive: true, dependencies: [Foos]) class Bars extends _$Bars { @override List<String> build() => <String>[]; Future<void> initialize() => Future.sync(() => [for (final _ in ref.read(foosProvider)) 'bar']); }
- foos.dart
问题描述
在Bars的Riverpod注解dependencies中:
@Riverpod(keepAlive: true, dependencies: [Foos])
Foos触发如下报错:
如果一个提供者依赖了指定了
dependencies的提供者,那么它自身也应该指定dependencies并包含所有作用域内的提供者。dart(provider_dependencies)
问题
请求帮忙解释该报错的含义,并提供对应的解决方法?
补充信息
- pubspec.yaml
environment: sdk: '>=2.19.4 <3.0.0' dependencies: flutter: sdk: flutter flutter_riverpod: ^2.3.0 riverpod_annotation: ^2.0.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.1 build_runner: ^2.3.3 custom_lint: ^0.3.2 riverpod_lint: ^1.1.5 riverpod_generator: ^2.0.0 flutter: uses-material-design: true - analysis_options.yaml
include: package:flutter_lints/flutter.yaml analyzer: exclude: - "**/*.g.dart" plugins: - custom_lint
报错含义解释
这个报错是riverpod_lint规则触发的校验提示:dependencies参数的作用是标记Provider属于某个作用域,绑定特定的生命周期。规则要求:只有本身声明了dependencies的Provider,才能被其他Provider的dependencies列表引用。而你的代码里Foos没有设置dependencies,却被Bars的dependencies引用,因此触发了错误提示。
解决方法
根据你的业务场景,有两种可行方案:
方案一:移除Bars的dependencies参数
如果Bars只是在方法中读取Foos的状态,不需要和Foos绑定生命周期,直接去掉dependencies即可,这是最常见的处理方式:
@Riverpod(keepAlive: true) // 移除dependencies参数 class Bars extends _$Bars { @override List<String> build() => <String>[]; Future<void> initialize() => Future.sync(() => [for (final _ in ref.read(foosProvider)) 'bar']); }
方案二:给Foos添加dependencies参数(若需生命周期绑定)
如果业务需要Bars和Foos的生命周期强绑定,那么先给Foos的注解添加dependencies(哪怕是空列表),这样Bars的引用就符合规则了:
// foos.dart修改 @Riverpod(keepAlive: true, dependencies: []) // 添加空dependencies class Foos extends _$Foos { // 原有代码不变 } // bars.dart保持原有代码 @Riverpod(keepAlive: true, dependencies: [Foos]) class Bars extends _$Bars { // 原有代码不变 }
通常只有当Provider需要和页面/组件等作用域绑定生命周期时,才需要使用dependencies参数,普通全局Provider只用keepAlive控制状态持久化即可。
内容的提问来源于stack exchange,提问作者user9836706
相关产品推荐
相关产品推荐

