我忘记在第一个代码的<Widget>
之后写children:
。但是children: <Widget>[]
和children: []
有什么区别。
children: <Widget>[
Expanded(
child: Container(
child: Image.asset('images/dice1.png'), ),),],
children: <Widget>[
Expanded(
child: Image.asset('images/dice1.png'),),];
答案 0 :(得分:0)
该语句声明接下来将要发生的事情的类型...如果您不声明将要为其选择的类型。建议您设置类型,以避免可能发生的进一步错配。
答案 1 :(得分:0)
来自Oracle Doc:
使用泛型代码比非泛型代码有很多好处: 在编译时进行更强的类型检查。 Java编译器适用性强 对通用代码进行类型检查,如果代码违反则发出错误 类型安全。修复编译时错误比修复运行时更容易 错误,这可能很难找到。
与Dart之类的语言相同:
在初始化列表之前添加Widget
时,如果您添加类型为children
的元素并且添加了其他类型,则Widget
参数的预期类型会知道这些类型是匹配的,您将收到编译时间消息。如果不添加该泛型类型,则仅在运行时才知道(请注意,即使没有泛型类型,但具有自定义类型,也可以推断出一些基本类型)。
小部件Column
children
参数,期望List<Widget>
。因此,如下所示:
List<Widget> chidren = <Widget>[];
如果未添加(dynamic
和Dart VM可以在运行时推断类型的默认类型):
List<Widget> chidren = [];
答案 2 :(得分:0)
在您写List<Widget> chidren = <Widget>[];
时,这里发生了两件事:
List<Widget> chidren
的引用。<Widget>[];
被分配给该引用。所以
通过用<Widget>
声明引用,是让编译器知道只有您要接受分配给该引用的对象应该是Widget
类型或{的子类型{1}}。
通过给对象分配Widget
,您就是在告诉编译器当前对象的类型为<Widget>
。在这里<Widget>
是说列表仅包含<Widget>[];
或Widget
的子类型。
如果在创建列表之前未指定类型,例如Widget
,则允许任何类型的对象出现在列表中。但是,如果您指定列表的类型为[];
,则列表中仅允许Widget
。
要进行测试,请尝试创建一个Widget
,然后尝试在其中添加int或string或任何任意类型的数据。您将被允许在其中保存任何类型的数据。现在创建List list = [];
,您将只能将小部件添加到列表中,而不能添加任何其他内容。
什么是泛型?
在该对象中输入错误的数据类型时,您将得到编译时错误而不是运行时错误。
在飞镖板上尝试:
List<Widget> list = <Widget>[];
//不会给您编译时错误,但会给出一个运行时错误,即无法将字符串分配给int。
List<int> ints = ['string'];
//将给您编译时错误。
关于错误,编译时错误比运行时错误要好得多。