在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不是一个过时的类吗?
发布于 2021-05-29 20:43:28
PreferredSize小部件的构造函数需要两个参数,分别是Widget child和Size preferredSize,方法是创建一个类来extends这个小部件,您需要遵守它的构造函数。在its documentation中,PreferredSize是这样描述的:
具有首选大小的小工具。
此小部件不会对其子部件施加任何约束,也不会以任何方式影响其子部件的布局。它只是通告一个可供父级使用的首选大小。
像Scaffold这样的父母使用PreferredSizeWidget来要求他们的孩子实现该接口。要为任意小部件提供首选大小,以便可以在该类型的子属性中使用它,可以使用小部件PreferredSize。
像AppBar这样的小部件实现了一个PreferredSizeWidget,因此对于它们来说这个PreferredSize小部件是不必要的。
如上所述,您的实现应该看起来更像是一个实现PreferredSizeWidget的StatelessWidget,其实现方式与为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'),
),
);
}
}基于颤振源的AppBar实现
class AppBar extends StatefulWidget implements PreferredSizeWidget {
// ...
}https://stackoverflow.com/questions/67750729
复制相似问题