在空安全之前我可以做:
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
不是过时的类吗?
答案 0 :(得分:0)
PreferredSize
小部件的构造函数需要 2 个参数,它们是 Widget child
和 Size 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 {
// ...
}