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

Flutter中无法创建唯一Provider:StateProviderFamily类型不匹配问题

问题:Riverpod StateProviderFamily 类型不匹配错误

我有一个可复用的Select组件,用于构建带筛选功能的页面,需要每个Select组件拥有唯一状态以便后续获取其值。尝试使用Riverpod的StateProviderFamily时出现以下错误:

Unhandled Exception: type 'AutoDisposeProviderFamily<String, String>' is not a subtype of type 'StateProviderFamily<String, String>' of 'function result'

对应的代码如下:

final selectValueProvider = StateProviderFamily<String,String>((ref, arg) =>'' );

class Select extends HookConsumerWidget {
    const Select({Key? key, required this.name}) : super(key: key);

    final String name;
    
     @override
    Widget build(BuildContext context, WidgetRef ref) {
    return Padding(
      padding: const EdgeInsets.only(top: 10.0),
      child: Center(
        child: FractionallySizedBox(
          widthFactor: 0.6,
          child: Container(
            decoration: BoxDecoration(color: Color.fromARGB(255, 189, 177, 177)),
            child:DropdownButton(
                  hint: Text("   " + name),
                  isExpanded: true,
                  items: [
                    DropdownMenuItem(child: Text('Audi'), value: 'Audi'),
                    DropdownMenuItem(child: Text('BMW'), value: 'BMW'),
                    DropdownMenuItem(child: Text('Yugo'), value: 'Yugo'),
                  ],
                  onChanged: (value) {
                    ref.read(selectValueProvider(name).notifier).update((state) => value!);
                 //   print('ji: '+ref.read(selectValueProvider(name)));
                  },
                  
                  
            ),
          ),
        ),
      ),
    );
  }
}

尝试过使用StateProvider.autodispose等不同状态,但错误依旧。


解决方案

这个错误的核心原因是Riverpod 2.x中不再直接使用StateProviderFamily类来声明家族状态Provider,正确的声明方式是通过StateProvider.family(非自动销毁)或StateProvider.autoDispose.family(自动销毁)的链式调用。

修正Provider声明

将原来的Provider声明替换为以下两种方式之一:

  1. 非自动销毁的家族Provider:
final selectValueProvider = StateProvider.family<String, String>((ref, arg) => '');
  1. 需要自动销毁的家族Provider(对应你尝试的autodispose场景):
final selectValueProvider = StateProvider.autoDispose.family<String, String>((ref, arg) => '');

组件代码无需修改

你的Select组件中读取和更新状态的逻辑是正确的,修正Provider声明后,ref.read(selectValueProvider(name).notifier).update((state) => value!)可以正常工作。


内容的提问来源于stack exchange,提问作者srgerh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:40:24