Flutter中如何将父类泛型类型传递给对应的State子类
问题根源
State类无法获取泛型参数T的核心原因是:你在声明State继承关系、createState方法时,没有给GenericList补全泛型参数,导致State作用域内的T是未指定的动态类型,既无法通过静态检查,也无法让Provider.of<T>匹配到正确的注册类型。
另外你的代码没有给T添加类型约束,直接调用list.map、name、totalSpending这类成员时,Dart无法确认T是否存在这些属性,会报编译错误。
修复方法
按以下三点调整代码即可:
- 给State类添加和Widget一致的泛型声明,继承
State时指定关联Widget的泛型为GenericList<T>,让State和Widget共享同一个泛型参数 - 给泛型T添加上界约束,限定T必须是具备你代码中调用的属性/方法的类型,通过静态检查
- 修正
createState方法的返回值类型,返回带对应泛型的State实例
修复后可运行代码
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; /// 自定义Provider基类,根据你的实际业务调整,统一所有传入GenericList的Provider的公共属性 abstract class BaseListProvider { /// 对应你代码中调用的map属性,调整为你实际的map类型即可 Map<dynamic, BaseListItem> get map; } /// 列表项基类,统一公共字段 abstract class BaseListItem { String get name; num get totalSpending; } class GenericList<T extends BaseListProvider> extends StatefulWidget { /// 原代码中传入providerType的参数无实际作用(泛型已指定类型),可按需保留或删除 final T? providerInitInstance; const GenericList({Key? key, this.providerInitInstance}) : super(key: key); @override State<GenericList<T>> createState() => _GenericListState<T>(); } class _GenericListState<T extends BaseListProvider> extends State<GenericList<T>> { @override Widget build(BuildContext context) { // 此处T可正确识别,Provider.of会匹配到上下文中对应类型的注册实例 final listProvider = Provider.of<T>(context); final items = listProvider.map; return ListView.builder( itemCount: items.length, itemBuilder: (context, int index) { final itemKey = items.keys.elementAt(index); final currentItem = items[itemKey]!; return ListTile( // 原代码onTap返回index无实际效果,替换为你的业务点击逻辑 onTap: () {}, title: Text(currentItem.name), trailing: Text(currentItem.totalSpending.toString()), ); }, ); } }
使用示例
实例化组件时直接指定泛型即可,不需要额外传类型参数:
// 假设你已经有继承BaseListProvider的CartProvider ChangeNotifierProvider( create: (context) => CartProvider(), child: GenericList<CartProvider>(), )
内容的提问来源于stack exchange,提问作者mert Özerdem
相关产品推荐
相关产品推荐

