在小部件之间共享尺寸
Share dimensions between widgets
在 Flutter 中我们可以使用 Themes
来共享颜色和字体样式。
https://flutter.io/docs/cookbook/design/themes
是否有我们可以以类似方式使用的现有最佳实践来共享值,例如边距、填充和宽度或高度?
最好是有助于遵守 material 设计指南的内容。
定义自定义小部件
最简单也可能是最优雅的方法是定义自定义小部件,例如在内部使用具有正确尺寸的 RaisedButton
的 MyRaisedButton
。
class MyRaisedButton extends StatelessWidget {
MyRaisedButton({
this.child,
this.onPressed,
});
final Widget child;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return RaisedButton(
padding: ...,
onPressed: onPressed,
child: child
);
}
}
这在大多数情况下效果出奇地好。
但是,如果您仍想保持小部件的灵活性(能够将大量自定义选项传递给构造函数),您的整体小部件定义很快就会变得很长,因为您需要将所有选项转发给 RaisedButton
.
在这种情况下,在整个应用程序中实际共享值是有意义的。
实际上在整个应用程序中共享价值
当然,这种方法也是可以的。
由于 Flutter 的开放性,我们可以只查看 how the Theme
is implemented 并复制该代码来创建一个功能类似于 Theme
的自定义小部件。
这是一个精简版:
@immutable
class MyThemeData {
MyThemeData({
this.myPadding,
this.myColor,
this.myString
});
final Padding myPadding;
final Color myColor;
final String myString;
}
class MyTheme extends StatelessWidget {
MyTheme({
Key key,
@required this.data,
@required this.child
}) : super(key: key);
final MyThemeData data;
final Widget child;
static MyThemeData of(BuildContext context) {
return (context.ancestorWidgetOfExactType(MyTheme) as MyTheme)?.data;
}
@override
Widget build(BuildContext context) => child;
}
现在,您可以将 MaterialApp
包装在 MyTheme
小部件中:
MyTheme(
data: MyThemeData(
myPadding: ...,
myColor: ...,
...
),
child: ... (here goes the MaterialApp)
)
然后在你的应用程序的任何地方,你可以写 MyTheme.of(context).myPadding
.
您可以根据需要调整 MyThemeData
class,存储您想要的任何内容。
在 Flutter 中我们可以使用 Themes
来共享颜色和字体样式。
https://flutter.io/docs/cookbook/design/themes
是否有我们可以以类似方式使用的现有最佳实践来共享值,例如边距、填充和宽度或高度?
最好是有助于遵守 material 设计指南的内容。
定义自定义小部件
最简单也可能是最优雅的方法是定义自定义小部件,例如在内部使用具有正确尺寸的 RaisedButton
的 MyRaisedButton
。
class MyRaisedButton extends StatelessWidget {
MyRaisedButton({
this.child,
this.onPressed,
});
final Widget child;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return RaisedButton(
padding: ...,
onPressed: onPressed,
child: child
);
}
}
这在大多数情况下效果出奇地好。
但是,如果您仍想保持小部件的灵活性(能够将大量自定义选项传递给构造函数),您的整体小部件定义很快就会变得很长,因为您需要将所有选项转发给 RaisedButton
.
在这种情况下,在整个应用程序中实际共享值是有意义的。
实际上在整个应用程序中共享价值
当然,这种方法也是可以的。
由于 Flutter 的开放性,我们可以只查看 how the Theme
is implemented 并复制该代码来创建一个功能类似于 Theme
的自定义小部件。
这是一个精简版:
@immutable
class MyThemeData {
MyThemeData({
this.myPadding,
this.myColor,
this.myString
});
final Padding myPadding;
final Color myColor;
final String myString;
}
class MyTheme extends StatelessWidget {
MyTheme({
Key key,
@required this.data,
@required this.child
}) : super(key: key);
final MyThemeData data;
final Widget child;
static MyThemeData of(BuildContext context) {
return (context.ancestorWidgetOfExactType(MyTheme) as MyTheme)?.data;
}
@override
Widget build(BuildContext context) => child;
}
现在,您可以将 MaterialApp
包装在 MyTheme
小部件中:
MyTheme(
data: MyThemeData(
myPadding: ...,
myColor: ...,
...
),
child: ... (here goes the MaterialApp)
)
然后在你的应用程序的任何地方,你可以写 MyTheme.of(context).myPadding
.
您可以根据需要调整 MyThemeData
class,存储您想要的任何内容。