Flutter中如何在State类访问StatefulWidget属性时保留泛型类型信息?
解决Flutter泛型StatefulWidget的类型丢失问题
问题根源
你写的_MyWidgetState继承State<MyWidget>时没指定泛型参数T,Flutter会默认把MyWidget当成MyWidget<dynamic>处理,导致widget.things的类型变成List<dynamic>,和你声明的List<T>不兼容,才会出现编译错误。
修复方案
把State类的泛型参数改成State<MyWidget<T>>,让State和带泛型参数的Widget类正确关联,就能保留完整的类型信息。
修正后的完整代码
import 'package:flutter/material.dart'; /// 修复后的泛型StatefulWidget示例 class MyWidget<T> extends StatefulWidget { final List<T> things; const MyWidget({Key? key, required this.things}) : super(key: key); @override _MyWidgetState<T> createState() => _MyWidgetState<T>(); } // 关键:指定State的泛型为MyWidget<T> class _MyWidgetState<T> extends State<MyWidget<T>> { @override Widget build(BuildContext context) { List<T> things = widget.things; // 编译错误消失 return Container(); } }
额外说明
- 修正后,State里的
widget会被正确识别为MyWidget<T>类型,widget.things的类型也会保持List<T>,和你声明的变量类型完全匹配。 - 这样后续使用
Filter<MyData>这类泛型过滤器时,回调函数(MyData) => bool就能正常工作,不会再出现类型 '(MyData) => bool' 不是 '(dynamic) => bool' 的子类型的运行时错误。
内容的提问来源于stack exchange,提问作者Jeff Neet
相关产品推荐
相关产品推荐

