在StatefulWidget内使用泛型函数做为数据交互方法时遇到相似 type '(String) => Null' is not a subtype of type '(dynamic) => void' 之类的问题:
git
可能不够具象 来上代码 :github
typedef TSwiperNormalItemBuilder<T> = Widget Function(T item); class TSwiperNormal<T> extends StatefulWidget { final List<T> items; final TSwiperNormalItemBuilder<T> itemBuilder; final ValueChanged<T> onTapItem; TSwiperNormal({Key key,@required this.items,@required this.itemBuilder,this.onTapItem}):super(key: key); @override _TSwiperNormalState createState() => _TSwiperNormalState<T>(); } class _TSwiperNormalState<T> extends State<TSwiperNormal> { @override Widget build(BuildContext context) { return Container( child: Swiper( itemBuilder: (c,i){ if (widget.itemBuilder is TSwiperNormalItemBuilder<T>){ return GestureDetector( onTap: (){ if(widget.onTapItem != null) widget.onTapItem(widget.items[i]); }, child: widget.itemBuilder(widget.items[i]), ); }else{ return Container(color: Colors.red,); } }, itemCount: widget.items.length, ), ); } } 复制代码
typedef TSwiperNormalItemBuilder<T> = Widget Function(T item); 复制代码
在github 找到的:
This is a pretty subtle one - try changing from:
markdown
class _SearchScreenState<T> extends State<SearchScreen> 复制代码
to
ide
class _SearchScreenState<T> extends State<SearchScreen<T>> 复制代码
So the State needs to be State<SearchScreen> to not lose type information.
一语惊醒梦中人 极有多是_XXXState在继承链上没有获得StatefulWidget传过来的泛型类型
函数
立马改为oop
typedef TSwiperNormalItemBuilder<T> = Widget Function(T item); class TSwiperNormal<T> extends StatefulWidget { final List<T> items; final TSwiperNormalItemBuilder<T> itemBuilder; final ValueChanged<T> onTapItem; TSwiperNormal({Key key,@required this.items,@required this.itemBuilder,this.onTapItem}):super(key: key); @override _TSwiperNormalState createState() => _TSwiperNormalState<T>(); } class _TSwiperNormalState<T> extends State<TSwiperNormal<T>> { //这个地方必定注意接收来自StatefulWidget的泛型类型 @override Widget build(BuildContext context) { return Container( child: Swiper( itemBuilder: (c,i){ if (widget.itemBuilder is TSwiperNormalItemBuilder<T>){ return GestureDetector( onTap: (){ if(widget.onTapItem != null) widget.onTapItem(widget.items[i]); }, child: widget.itemBuilder(widget.items[i]), ); }else{ return Container(color: Colors.red,); } }, itemCount: widget.items.length, ), ); } } 复制代码
代码生成等插件、快捷键当然提示开发效率,但也要时刻警戒他们给你挖坑
ps:其实主要问题仍是我本身 一开始没想加泛型 因此代码也没自动生成这个T 被本身气到变形ui