自定义脚手架 class 不绘制 AppBar

Custom Scaffold class not draw the AppBar

我正在尝试创建一个扩展原始 class 的自定义脚手架。 如果没有传递一个新的,则使用默认的 AppBar。

class CommonScaffold extends Scaffold {
  final AppBar? appBar;
  final Widget body;

  CommonScaffold({
    Key? key,
    this.appBar,
    required this.body,
  }) : super(
    key: key,
    body: body,
    appBar: appBar ??
        AppBar(
          title: const Text("Default Text"),
        ),
  );
}

如果我调用 class 避免传递 appBar 参数,AppBar 将不会出现。但是应该会出现。

@override
  Widget build(BuildContext context) {
    return CommonScaffold(
      body: _createContent(),
    );
  }

如果我调用 class 将 AppBar 传递给 appBar 参数,AppBar 将出现。

@override
  Widget build(BuildContext context) {
    return CommonScaffold(
      body: _createContent(),
      appBar: AppBar(
          title: const Text("TEST"),
      ),
    );
  }

如果你只想显示或不显示 appBar 你可以通过修改 bool 的值来使用这个例子来显示或不显示 bar

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: (showAppbar)? AppBar(
          title: const Text("Default Text"),
        ): AppBar(
          title: const Text("TEST"),
      ),
      body: Center(
        child: Text(
          'Hello, a!',
        ),
      ),
    );
  }

这里的问题是 CommonScaffold 有两个 appBarbody。第一组是因为 extends Scaffold 而第二组是在 CommonScaffold.

上声明两个

您可以通过 运行 此代码段检查它在 OOP 上的工作方式。 On dartPad。我正在更改名称以更好地理解这个概念。

class Super {
  final int? a;
  final int? b;

  const Super({this.a, this.b});
}

class Common extends Super {
  final int? ca;
  final int b;

  const Common({this.ca, required this.b}) : super(a: ca ?? 10, b: b);
}

void main() {
  final c = Common(b: 1);
  print("supper a: ${c.a}"); // 10:  will refer supper class 
  print("Common a: ${c.ca}"); // null:  will refer common class 
}

现在为您解答,最好更改 CommonScaffold 的属性名称以避免与超级 class.

冲突

这是 dartPad

上的答案

class CommonScaffold extends Scaffold {
  final AppBar? cAppBar;

  final Widget? cBody;

  CommonScaffold({
    Key? key,
    this.cAppBar,
    this.cBody,
  }) : super(
            key: key,
            body: cBody,
            appBar: cAppBar ??
                AppBar(
                  title: Text("Default Appbar"),
                ));
}

class A extends StatelessWidget {
  const A({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CommonScaffold(
      cBody: Text("body"),
    );
  }
}