为什么我的自建窗口小部件的命名参数在Flutter中不起作用?

时间:2019-11-18 12:50:21

标签: flutter dart

我想将嵌套的Padding / Container / Padding结构包装在它自己的Widget中,以便我可以重用它:

我通过以下方式声明我的Widget:

class UpperWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Container(
          width: this.width,
          child: Padding(padding: const EdgeInsets.all(8.0), child: child)),
    );
  }

  final double width;
  final Widget child;

  const UpperWidget(Key key, this.width, this.child) : super(key: key);
}

我想在以下地方使用它:

class LowerWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return UpperWidget(
      width:50,
      child: Text("Hello World");
      }),
    );
  }
}

当我将鼠标悬停在宽度上时,Android Studio会向我显示错误:

3 required argument(s) expected but 0 found
Try adding additional required arguments.

The named parameter 'width' isn't defined.
Try correcting the name to an existing parameter, or defining a parameter with this name.

我该怎么办,以便widthchild被正确地当作已命名参数对待?

2 个答案:

答案 0 :(得分:1)

您需要通过将它们包裹在大括号{}中来制成optional

class UpperWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Container(
          width: this.width,
          child: Padding(padding: const EdgeInsets.all(8.0), child: child)),
    );
  }

  final double width;
  final Widget child;

  const UpperWidget({Key key, this.width, this.child}) : super(key: key);
}

如果还需要它们,则可以包含@required批注:

const UpperWidget({Key key, @required this.width, @required this.child}) : super(key: key);

答案 1 :(得分:1)

只需更改您的构造函数架构,

ng update

命名参数和可选参数是可选参数的类型。命名参数通过大括号“ {}”声明。

有关更多详细信息,请访问Blog Here.