使用Dart 2构建通用项目生成器
我一直在使用Lime作者在一篇文章中提供的一些代码来构建分页的条目生成器。在切换到Dart 2之前,这一直运行得很好。我已经制作了一个关于这个问题的小演示。问题在于stats方法。使用Dart 1时,它很乐意接受贴图参数,但现在我只能使用dynamic使其工作。我还没有完全弄清楚原因,如果有人对泛型有更好的理解,能给我解释一下,我将不胜感激 颤振投掷:使用Dart 2构建通用项目生成器,dart,flutter,Dart,Flutter,我一直在使用Lime作者在一篇文章中提供的一些代码来构建分页的条目生成器。在切换到Dart 2之前,这一直运行得很好。我已经制作了一个关于这个问题的小演示。问题在于stats方法。使用Dart 1时,它很乐意接受贴图参数,但现在我只能使用dynamic使其工作。我还没有完全弄清楚原因,如果有人对泛型有更好的理解,能给我解释一下,我将不胜感激 颤振投掷: I/flutter (12798): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞══════════
I/flutter (12798): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (12798): The following assertion was thrown during performLayout():
I/flutter (12798): type '(Map<dynamic, dynamic>) => Widget' is not a subtype of type '(dynamic) => Widget'
I/flutter (12798):
I/flutter (12798): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter (12798): more information in this error message to help you determine and fix the underlying cause.
I/flutter (12798): In either case, please report this assertion by filing a bug on GitHub:
I/flutter (12798): https://github.com/flutter/flutter/issues/new
I/颤振(12798):══╡ 呈现库捕获到异常╞═════════════════════════════════════════════════════════
I/flatter(12798):在performLayout()期间抛出了以下断言:
I/flatter(12798):type'(Map)=>Widget'不是type'(dynamic)=>Widget'的子类型
I/颤振(12798):
I/flatter(12798):要么断言表明框架本身存在错误,要么我们应该提供
I/flatter(12798):此错误消息中的更多信息可帮助您确定和修复根本原因。
I/flatter(12798):无论哪种情况,请在GitHub上提交一个bug来报告这一断言:
I/颤振(12798):https://github.com/flutter/flutter/issues/new
代码如下:
import 'package:flutter/material.dart';
typedef Widget WidgetAdapter<T>(T t);
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Generic Type Example',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Generic Type Example', widgetAdapter: stats),
);
}
}
class MyHomePage<T> extends StatefulWidget {
MyHomePage({Key key, this.title, this.widgetAdapter}) : super(key: key);
final String title;
final WidgetAdapter<T> widgetAdapter;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState<T> extends State<MyHomePage<T>> {
List<T> data;
Widget genericItemBuilder(BuildContext context, int index) {
if (data == null) {
data = fetchDataPage();
}
return widget.widgetAdapter(data[index]);
}
List<T> fetchDataPage() {
List listOfMap = [{"A": "1"}, {"B": "2"}, {"C": "3"}, {"D": "4"}, {"E": "5"}];
return listOfMap;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new ListView.builder(
itemBuilder: genericItemBuilder,
itemCount: 5,
),
);
}
}
/// This used to work with Dart 1. Now, for it to work with Dart 2 I have to change it from Map to dynamic.
/// I don't understand why this is.
Widget stats(Map val) {
return new Text(val.toString());
}
导入“包装:颤振/材料.省道”;
类型定义窗口小部件WidgetAdapter(T);
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“泛型类型示例”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新的MyHomePage(标题:“泛型类型示例”,widgetAdapter:stats),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key-Key,this.title,this.widgetAdapter}):超级(Key:Key);
最后的字符串标题;
最终WidgetAdapter WidgetAdapter;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
列出数据;
Widget genericItemBuilder(构建上下文,int索引){
如果(数据==null){
data=fetchDataPage();
}
返回widget.widgetAdapter(数据[索引]);
}
列表fetchDataPage(){
ListListOfMap=[{“A”:“1”},{“B”:“2”},{“C”:“3”},{“D”:“4”},{“E”:“5”}];
返回地图列表;
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:新建ListView.builder(
itemBuilder:genericItemBuilder,
物品计数:5,
),
);
}
}
///这通常用于Dart 1。现在,为了让它与Dart 2一起工作,我必须将它从Map更改为dynamic。
///我不明白这是为什么。
小部件统计(映射值){
返回新文本(val.toString());
}
问题在于您的MyHomePage
和\u MyHomePageState
都是通用的
但是您的createState
根本没有指定任何类型。因此它默认为dynamic
,而不是Map
将您的
createState
更改为\u MyHomePageState createState()=>new\u MyHomePageState()
应该可以解决这个问题。我觉得这是个bug。您使用的是哪种颤振版本?请尝试flatterchannelmaster
flatterdoctor
。谢谢。我使用的是v0.2.8(测试版)。我已切换到master,但仍然收到相同的错误。颤振医生显示:[✓] 颤振(通道测试版,v0.2.8,Linux上,语言环境en_GB.UTF-8)[✓] Android工具链-为Android设备开发(Android SDK 27.0.3)[✓] Android Studio(3.1版)[✓] IntelliJ IDEA社区版(2018.1版)[✓] VS代码(版本1.22.2)[✓] 连接设备(1个可用)
谢谢你的建议。我已经尝试了一下,虽然我仍然得到一个错误,但我可能更接近于理解它:类型'List'不是类型'List'的子类型,其中
对于列表
事情,我会更改列表地图=[{“a”:“1”},…
到var-listOfMap=[{“A”:“1”},…
是的,但这不起作用。因为此函数无效。t
可能不是Map
。将其更改为var-listOfMap=[{“A”:“1”},…
导致一个元素类型“Map”无法分配给列表类型“t”。
错误。我想知道我是否以错误的方式处理此任务,但我真的很想理解为什么它与Dart 1而不是2一起工作。颤振几乎总是有Dart 2。不同的是,以前它不是“强模式”.现在是了。你所指的错误是真正的错误,即使没有强模式。不同的是,以前dart无法检测到它们。