保持 flutter 的样式独立于视图代码
Keeping flutter's styling separate / independent of view code
这就是我今天设计一个简单的 flutter 按钮的方式 -
FlatButton(
child: Text('Hello'),
onPressed: () {},
color: Colors.blue,
colorBrightness: Brightness.dark,
disabledColor: Colors.blueGrey,
highlightColor: Colors.red,
padding: EdgeInsets.symmetric(
horizontal: 8.0, vertical: 5.0)
)
似乎 flutter 的视图代码需要在每个组件中内置样式?我怎样才能把它完全分开?类似于 CSS(几乎)为网络所做的事情?看起来代码会更清晰,我也可以重用我的样式。
我可以子class 像亮度 class 这样的自定义亮度,但这似乎有点矫枉过正。
此外,今天找到了这个包裹,它让我更接近我想要的东西 - https://pub.dev/packages/division
理想情况下,在 flutter 中将样式与视图代码分开有哪些好的做法?
提前致谢!
也许您可能知道,但您可以在 main.dart、
中声明通用样式
For Button theme,
ThemeData(
...
buttonTheme: ButtonThemeData(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
colorScheme: colorSchemeDark,
splashColor: AppColors.themeColor.shade900,
height: 50,
highlightColor: AppColors.themeColor.shade800,
textTheme: ButtonTextTheme.primary,
),
)
For card theme,
ThemeData(
...
cardTheme: CardTheme(
margin: EdgeInsets.only(top: 8, left: 8, right: 8, bottom: 8),
elevation: 6.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
)
我创建了一个gist here
使用这个包https://pub.dev/packages/division
它允许您为小部件创建样式、存储它们以供重复使用等等。
final textStyle = TxtStyle()
..textColor(Colors.white)
..fontSize(30)
..bold()
..italic()
..textAlign.start();
Text(
'hi',
style:textStyle
)
解决方案 1
您可以创建具有默认样式的可重用 FlattButon
,并且您可以随时覆盖样式:
示例:
class MyFlatButton extends StatelessWidget {
const MyFlatButton({
Key key,
@required this.text,
@required this.onPressed,
this.color = Colors.blue, // set default Values
this.colorBrightness = Brightness.dark, //
this.disabledColor = Colors.blueGrey, //
this.highlightColor = Colors.red, //
this.padding =
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 5.0), //
}) : super(key: key);
final String text;
final VoidCallback onPressed;
final Color color;
final Brightness colorBrightness;
final MaterialColor disabledColor;
final MaterialColor highlightColor;
final EdgeInsetsGeometry padding;
@override
Widget build(BuildContext context) {
return FlatButton(
child: Text(
'$text',
),
onPressed: onPressed,
color: color,
colorBrightness: colorBrightness,
disabledColor: disabledColor,
highlightColor: highlightColor,
padding: padding,
);
}
}
您可以像 MyFlatButton 一样在您的应用程序中使用它而不是 FlatButton
child: MyFlatButton(
text: 'Hello',
onPressed: () {},
color: Colors.cyan,
),
解决方案 2
如果您想 "completely" 分离样式,您可以创建一个额外的 Class 来保存样式
class MyFlatButton2 extends StatelessWidget {
const MyFlatButton2({
Key key,
@required this.text,
@required this.onPressed,
this.styles = const ButtonStyles(),
}) : super(key: key);
final String text;
final VoidCallback onPressed;
final ButtonStyles styles;
@override
Widget build(BuildContext context) {
final btnStyles = ButtonStyles();
return FlatButton(
child: Text('$text'),
onPressed: onPressed,
color: styles.color ?? btnStyles.color,
colorBrightness: styles.colorBrightness ?? btnStyles.colorBrightness,
disabledColor: styles.disabledColor ?? btnStyles.disabledColor,
highlightColor: styles.highlightColor ?? btnStyles.highlightColor,
padding: styles.padding ?? btnStyles.padding,
);
}
}
// Styles Class
class ButtonStyles {
final Color color;
final Brightness colorBrightness;
final MaterialColor disabledColor;
final MaterialColor highlightColor;
final EdgeInsetsGeometry padding;
const ButtonStyles({
this.color = Colors.blue, // set default Values
this.colorBrightness = Brightness.dark, //
this.disabledColor = Colors.blueGrey, //
this.highlightColor = Colors.red, //
this.padding =
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 5.0), //
});
}
然后就可以使用了
使用默认样式
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
),
或者您可以覆盖样式
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
styles: ButtonStyles(
colorBrightness: Brightness.dark,
color: Colors.green,
padding: EdgeInsets.all(20),
),
),
Extra,你也可以有一些带有预定义样式的命名构造函数
factory ButtonStyles.predefinedStyle1() => ButtonStyles(
color: Colors.green, // set default Values
colorBrightness: Brightness.light, //
disabledColor: Colors.red, //
highlightColor: Colors.red, //
padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 15.0),
);
然后是
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
styles: ButtonStyles.predefinedStyle1(),
),
这就是我今天设计一个简单的 flutter 按钮的方式 -
FlatButton(
child: Text('Hello'),
onPressed: () {},
color: Colors.blue,
colorBrightness: Brightness.dark,
disabledColor: Colors.blueGrey,
highlightColor: Colors.red,
padding: EdgeInsets.symmetric(
horizontal: 8.0, vertical: 5.0)
)
似乎 flutter 的视图代码需要在每个组件中内置样式?我怎样才能把它完全分开?类似于 CSS(几乎)为网络所做的事情?看起来代码会更清晰,我也可以重用我的样式。
我可以子class 像亮度 class 这样的自定义亮度,但这似乎有点矫枉过正。
此外,今天找到了这个包裹,它让我更接近我想要的东西 - https://pub.dev/packages/division
理想情况下,在 flutter 中将样式与视图代码分开有哪些好的做法?
提前致谢!
也许您可能知道,但您可以在 main.dart、
中声明通用样式For Button theme,
ThemeData(
...
buttonTheme: ButtonThemeData(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
colorScheme: colorSchemeDark,
splashColor: AppColors.themeColor.shade900,
height: 50,
highlightColor: AppColors.themeColor.shade800,
textTheme: ButtonTextTheme.primary,
),
)
For card theme,
ThemeData(
...
cardTheme: CardTheme(
margin: EdgeInsets.only(top: 8, left: 8, right: 8, bottom: 8),
elevation: 6.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
)
我创建了一个gist here
使用这个包https://pub.dev/packages/division
它允许您为小部件创建样式、存储它们以供重复使用等等。
final textStyle = TxtStyle()
..textColor(Colors.white)
..fontSize(30)
..bold()
..italic()
..textAlign.start();
Text(
'hi',
style:textStyle
)
解决方案 1
您可以创建具有默认样式的可重用 FlattButon
,并且您可以随时覆盖样式:
示例:
class MyFlatButton extends StatelessWidget {
const MyFlatButton({
Key key,
@required this.text,
@required this.onPressed,
this.color = Colors.blue, // set default Values
this.colorBrightness = Brightness.dark, //
this.disabledColor = Colors.blueGrey, //
this.highlightColor = Colors.red, //
this.padding =
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 5.0), //
}) : super(key: key);
final String text;
final VoidCallback onPressed;
final Color color;
final Brightness colorBrightness;
final MaterialColor disabledColor;
final MaterialColor highlightColor;
final EdgeInsetsGeometry padding;
@override
Widget build(BuildContext context) {
return FlatButton(
child: Text(
'$text',
),
onPressed: onPressed,
color: color,
colorBrightness: colorBrightness,
disabledColor: disabledColor,
highlightColor: highlightColor,
padding: padding,
);
}
}
您可以像 MyFlatButton 一样在您的应用程序中使用它而不是 FlatButton
child: MyFlatButton(
text: 'Hello',
onPressed: () {},
color: Colors.cyan,
),
解决方案 2
如果您想 "completely" 分离样式,您可以创建一个额外的 Class 来保存样式
class MyFlatButton2 extends StatelessWidget {
const MyFlatButton2({
Key key,
@required this.text,
@required this.onPressed,
this.styles = const ButtonStyles(),
}) : super(key: key);
final String text;
final VoidCallback onPressed;
final ButtonStyles styles;
@override
Widget build(BuildContext context) {
final btnStyles = ButtonStyles();
return FlatButton(
child: Text('$text'),
onPressed: onPressed,
color: styles.color ?? btnStyles.color,
colorBrightness: styles.colorBrightness ?? btnStyles.colorBrightness,
disabledColor: styles.disabledColor ?? btnStyles.disabledColor,
highlightColor: styles.highlightColor ?? btnStyles.highlightColor,
padding: styles.padding ?? btnStyles.padding,
);
}
}
// Styles Class
class ButtonStyles {
final Color color;
final Brightness colorBrightness;
final MaterialColor disabledColor;
final MaterialColor highlightColor;
final EdgeInsetsGeometry padding;
const ButtonStyles({
this.color = Colors.blue, // set default Values
this.colorBrightness = Brightness.dark, //
this.disabledColor = Colors.blueGrey, //
this.highlightColor = Colors.red, //
this.padding =
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 5.0), //
});
}
然后就可以使用了 使用默认样式
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
),
或者您可以覆盖样式
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
styles: ButtonStyles(
colorBrightness: Brightness.dark,
color: Colors.green,
padding: EdgeInsets.all(20),
),
),
Extra,你也可以有一些带有预定义样式的命名构造函数
factory ButtonStyles.predefinedStyle1() => ButtonStyles(
color: Colors.green, // set default Values
colorBrightness: Brightness.light, //
disabledColor: Colors.red, //
highlightColor: Colors.red, //
padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 15.0),
);
然后是
child: MyFlatButton2(
text: 'Hello',
onPressed: () {},
styles: ButtonStyles.predefinedStyle1(),
),