我已经为我的搜索筛选器项目定义了如下模型:

typedef OnFilterButtonPressed<T> = String Function(SearchFilterItemModel<T> searchFilterItem);

class SearchFilterItemModel<T> {
  final String id, name;
  final OnFilterButtonPressed<T> onPressed;

  SearchFilterItemModel({
    required this.id,
    required this.name,
    required this.onPressed,
  });
}

然后,我定义了一个筛选项列表.

List<SearchFilterItemModel> searchFilterItems = [
  SearchFilterItemModel<DateTime>(
    id: "filter_id_date",
    name: "Date",
    onPressed: (SearchFilterItemModel<DateTime> item) {
      return item.id;
    },
  ),
  SearchFilterItemModel<String>(
    id: "filter_id_cost",
    name: "Cost",
    onPressed: (SearchFilterItemModel<String> item) {
      return item.id;
    },
  ),
];

我将搜索筛选器项作为onPressed函数参数传递,因为我需要访问onPressed函数当前所在的当前模型.您可以看到,我已经在onPressed功能块中使用了项ID.

现在,我已经定义了示例Main函数,如下所示:

void main() {
  print(searchFilterItems.map<String>((SearchFilterItemModel filterItem) {
    return filterItem.onPressed(filterItem);
  }));
}

它会抛出以下错误:

未处理的异常: 类型‘(SearchFilterItemModel&lt;DateTime&gt;)=&gt;字符串’不是类型‘(SearchFilterItemModel&lt;动态&>)=&gt;字符串’的子类型

错误在Main函数的第return filterItem.onPressed(filterItem);行抛出.

问题:

  1. 为什么它不能将动态类型转换为字符串类型?
  2. 我如何修改我的代码来解决它?

推荐答案

您应该在按下时删除函数的类型

List<SearchFilterItemModel> searchFilterItems = [
  SearchFilterItemModel<DateTime>(
    id: "filter_id_date",
    name: "Date",
    onPressed: (SearchFilterItemModel item) {
      return item.id;
    },
  ),
  SearchFilterItemModel<String>(
    id: "filter_id_cost",
    name: "Cost",
    onPressed: (SearchFilterItemModel item) {
      return item.id;
    },
  ),
];

为什么要使用返回同一对象的字段的函数?很奇怪.

这样做不是很管用吗?

get onPressed => id

如果您需要了解类型,可以在onPressed上执行此操作

 print(searchFilterItems.map<String>((SearchFilterItemModel filterItem) {
      switch(filterItem){
        case SearchFilterItemModel<String>():
          return "It's string ${filterItem.id}";
        case SearchFilterItemModel<DateTime>():
          return "It's datetime ${filterItem.id}";
      }
      return filterItem.onPressed(filterItem);
    }));
}

Flutter相关问答推荐

获取屏幕大小的滚动视图与动态大小?

手势捕获的异常:类型';Double';不是类型转换中类型';Double';的子类型

build_runner显示错误没有为类ClassDeclaration定义getter宏关键字'

在保持标高=1的情况下更改AppBar立面 colored颜色 /遮罩

升级到Ffltter 3.16后,应用程序栏、背景 colored颜色 、按钮大小和间距都会发生变化

无法在仿真器上运行Flutter 项目-文件名太长错误

Flutter :URI的目标不存在

如果我使用搜索栏,如何在嵌套滚动视图中停止自动滚动?

FittedBox叠加技术在Flutter 中的应用

BaseInputfield和Textfield有什么不同?

如何在Flutter 安全存储器中存储对象值?

hooks_riverpod 有用途吗

为什么将 bloc 提供程序放在单独的文件/类中会引发错误?

Riverpod 在使用冻结副本更新状态时触发重建,即使没有任何更改

无效的 depfile: C:\xxx\xxx\Flutter\project_name\.dart_tool\flutter_build\df4b308df1ee4bce22c56c71751554d1\kernel_snapshot.d 无效

.info/connected 这两个代码之间有什么区别吗?

如何使用 Row 和 Column 制作 L 形布局?

如何按键在 map 列表中搜索

Flutter:font_awesome_icon pro 版报错?如何设置 font_awesome 克隆仓库的路径?

Flutter 小部件中的视图和逻辑分离