空安全后,PreferredSize 小部件有什么用?

时间:2021-05-29 11:18:28

标签: flutter dart dart-null-safety

在空安全之前我可以做:

class FooBar extends PreferredSize {
  final String data;
  FooBar(this.data);

  @override
  Size get preferredSize => Size.fromHeight(100);

  @override
  Widget build(BuildContext context) {
    return DashingText(data); // My own implementation. 
  }
}

并像这样使用它:

Scaffold(
  appBar: FooBar('My App bar'),
)

但是对于空安全,我收到一个错误,我需要向超类提供 child。如果我必须向超类提供 child,那么覆盖超类的 build 方法有什么好处?空安全到来后,PreferredSize 不是过时的类吗?

1 个答案:

答案 0 :(得分:0)

PreferredSize 小部件的构造函数需要 2 个参数,它们是 Widget childSize preferredSize,通过创建一个 extends 这个小部件的类,您需要遵守其构造函数。在 its documentation 中,PreferredSize 是这样描述的:

<块引用>

具有首选大小的小部件。

这个小部件不会对其子部件施加任何约束,并且它 不会以任何方式影响孩子的布局。它只是宣传一个 父母可以使用的首选尺寸。

像 Scaffold 这样的父母使用 PreferredSizeWidget 来要求他们的 孩子实现该接口。给一个首选大小 任意小部件,以便它可以在该小部件的子属性中使用 类型,这个小部件,PreferredSize,可以使用。

像 AppBar 这样的小部件实现了一个 PreferredSizeWidget,这样 PreferredSize 小部件对他们来说不是必需的。

如上所述,您的实现应该看起来更像是 StatelessWidget 实现了 PreferredSizeWidget,其描述方式与 AppBar 相同:

class MyWidget extends StatelessWidget implements PreferredSizeWidget {
  @override
  Widget build(BuildContext context) {
    return Text('Hello, World!');
  }
  
  @override
  Size get preferredSize => Size.fromHeight(100);
}

编辑:PreferredSize 示例

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: const Size.fromHeight(80.0),
        child: Container(
          decoration: const BoxDecoration(
            gradient: LinearGradient(
              colors: <Color>[Colors.blue, Colors.pink],
            ),
          ),
          child: const AppBarContent(),
        ),
      ),
      body: const Center(
        child: Text('Content'),
      ),
    );
  }
}

来自 Flutter 源的 AppBar 实现

class AppBar extends StatefulWidget implements PreferredSizeWidget {
  // ...
}