如何将Provider类名作为参数传递?遇到非类型无法用作类型参数报错如何解决
问题原因
你这里的核心问题是混淆了Dart泛型参数和普通运行时参数的用法:
- 泛型参数
<T>是编译阶段就确定的类型标识,而你定义的providerClassName是普通的函数入参,属于运行时才能拿到的值,根本不能放到<>里作为类型参数使用。 - 你声明的泛型
T本身就可以直接作为Provider的类型,不需要额外传类名参数,之前的写法属于多余操作。
修改方案
1. 调整函数定义
直接把泛型T作为Provider的类型参数即可。如果你的所有Provider类都有username属性,建议给泛型加上类型约束避免编译报错,可以先抽一个公共的抽象类作为约束:
// 可选:抽公共基类加类型约束,安全性更高 abstract class BaseUserProvider { String get username; } // 你的原有Provider类实现/继承基类即可 class HomeScreenProvider extends ChangeNotifier implements BaseUserProvider { @override String get username => "实际的用户名逻辑"; // 其他原有逻辑 } // 带类型约束的函数定义 Widget buildText<T extends BaseUserProvider>() { return Text( Provider.of<T>(context, listen: false).username ); } // 如果不想加约束,也可以直接用无约束版本,只要你保证传入的Provider一定有username属性 Widget buildText<T>() { return Text( Provider.of<T>(context, listen: false).username ); }
2. 调整调用方式
调用时直接把Provider类作为泛型参数传入函数即可,不需要额外传命名参数:
buildText<HomeScreenProvider>();
内容的提问来源于stack exchange,提问作者Soumya mohnani
相关产品推荐
相关产品推荐

