You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解并解决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']);
      }
      
问题描述

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:52