当前位置: 首页 > 知识库问答 >
问题:

使用可选参数的飞镖/颤振子分类

刘狐若
2023-03-14

我试图弄清楚如何创建一个类的子类,而不指定父类的所有可选参数,但仍然可以从子类的构造函数访问这些参数。当用无数的属性对Flutter小部件进行子类时,这一点尤其重要。

这里有一个例子。

    // Maine widget
    class DoorWidget {
      String color = 'red';
      int width;
      int height;
      int p1;
      int p2;
      int p3;
      Function onKicked = () => print('Kicked');

      DoorWidget(this.color, {this.onKicked, this.width, this.height, this.p1, this.p2, this.p3});
    }

    class ChildDoorWidget extends DoorWidget {
      @override
      String color = 'green';
      ChildDoorWidget(String color, {Function onKicked, int width, int height})
          // Do I need to specify every parent optional parameter in the super class?
          // Is there a way to avoid this.
          : color = color,
            super(color, onKicked: onKicked, width: width);
    }

    main() {

      DoorWidget d = DoorWidget('green', width: 10, onKicked: () => print('DoorWidget Kicked') );
      print('Text Class');
      print(d.color);
      print(d.width);
      d.onKicked();

      ChildDoorWidget c = ChildDoorWidget('blue',
          width: 12, onKicked: () => print('ChildDoorWidget tapped called'));
      // Ideally I would like to do this:
      //  ChildDoorWidget m = ChildDoorWidget('blue', width: 12, onKicked: () => print('tapped called'), p1: 1, p2: 2, and any other optional params);
      print('\nMyText Class');
      print(c.color);
      print(c.width);
      c.onKicked();
    }

共有1个答案

山翼
2023-03-14

实际上,没有直接和简单的方法来调用具有未定义参数的构造函数。

你想打电话:

ChildDoorWidget m = ChildDoorWidget('blue', width: 12, 
                      onKicked: () => print('tapped called'),
                      p1: 1, p2: 2);

但是,由于P1P2没有在ChildDoorWidget的构造函数上定义,您将得到错误“named parameter is not defined”。

ChildDoorWidget m = ChildDoorWidget('blue', width: 12, 
                      onKicked: () => print('tapped called'))
                      ..p1=1..p2=2;
ChildDoorWidget m = ChildDoorWidget('blue')
                   ..width = 12
                   ..onKicked = (() => print('tapped called'))
                   ..p1 = 1
                   ..p2 = 2;

观察:coloronkickondoorwidget的初始化值是无用的,因为构造函数会重写这些值。这对于ChildDoorWidget上的color有效。

以下是使用上述实现对初始代码的修订:

void show(dynamic d) {
  print('\ncolor=${d.color}\nwidth=${d.width}\nheight=${d.height}\np1=${d.p1}\np2=${d.p2}\np3=${d.p3}\nonKicked=${d.onKicked}');
  d.onKicked == null ? '' : d.onKicked();
}

class DoorWidget {
  String color;
  int width;
  int height;
  int p1;
  int p2;
  int p3;
  Function onKicked;
  DoorWidget(this.color,
      {this.onKicked, this.width, this.height, this.p1, this.p2, this.p3});
}

class ChildDoorWidget extends DoorWidget {
  @override
  String color = 'orange'; //initialization useless because constructor overrides it with "this.color"

  ChildDoorWidget(String this.color) : super(color);
}

main() {
  print('\n\n\n create DoorWidget with color, width and onKicked');
  DoorWidget d = DoorWidget('green',
      width: 10, onKicked: () => print('DoorWidget Kicked'));
  show(d);

  print('\n\n\n create ChildDoorWidget with color, width and onKicked');
  ChildDoorWidget c = ChildDoorWidget('blue')
    ..width = 12
    ..onKicked = () => print('ChildDoorWidget tapped called');
  show(c);

  print('\n\n\n create ChildDoorWidget with many parameters');
  ChildDoorWidget m = ChildDoorWidget('yellow')
    ..width = 12
    ..onKicked = (() => print('tapped called'))
    ..p1 = 1
    ..p2 = 2;
  show(m);
}
 类似资料:
  • 在flutter示例页面中,有一个名为“将数据发送到新屏幕”的项目。我对第65行的构造函数有一个重新保护的问题。

  • 我已经在我的服务器上创建了一个RSA密钥对,只有服务器才会有私钥。客户端(Flatter应用程序)将访问公钥。因此,当服务器收到加密消息时,它将知道消息来自正确的客户端,并将使用其私钥解密通过公钥加密的消息。 当服务器(php7.3)向客户端发送回复时,我想在服务器端通过私钥加密消息,以便客户端可以用公钥解密消息。 非对称加密有其自身的局限性,如最大字符长度。但如果能送来就好了 Flutter包加

  • 我一直在使用VSCode进行颤振开发,但没有问题。今天,飞镖分析器突然抱怨说,大多数类都是未定义的,或者目标不存在。 有人见过这个吗? 我已经重新启动了VSCode,重新启动了计算机,卸载了flutter/dart插件,运行flutter dr没有任何问题……我没有想法了。 VSCode问题

  • 我试图改变从API返回的日期字符串的格式。下面的日期格式输入字符串在java中工作正常,但在Dart中则不行。

  • 我对flutter和dart非常陌生,正在尝试使用全局状态的单例实例(?).这是从后端服务器获得的公司信息。当flutter app启动时,向服务器发送请求并获得响应,然后基于响应构建一个singleton实例。所以我创造了阶级 在main.dart中 我做错了什么?