在初始化之前添加通用类型和忽略它之间有什么区别

时间:2019-12-28 16:38:34

标签: flutter flutter-layout

我忘记在第一个代码的<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'),),];

3 个答案:

答案 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>[];时,这里发生了两件事:

  1. 创建了List<Widget> chidren的引用。
  2. ,并且对象<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']; //将给您编译时错误。

关于错误,编译时错误比运行时错误要好得多。