flutter 泛型函数 不匹配问题

在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

相关文章
相关标签/搜索