举个栗子,封装一个 Text Widget 。
方式一
优点:
不用担心为了自定义某个预设样式,而导致所有预设样式丢失。
缺点:
这里只是暴露了 Text 控件的几个属性,实际开发中一个 Widget 可能需要暴露很多属性,后面扩展下来,属性列表可能会拉的很长。在这里极限情况就要暴露 Text 控件的所有属性给外界。
class TextWidget extends StatelessWidget {
final String text;
final Color? color;
final double? fontSize;
final FontWeight? fontWeight;
const TextWidget({
Key? key,
required this.text,
this.color = Colors.black,
this.fontSize = 16,
this.fontWeight = FontWeight.normal,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(
text,
style: TextStyle(
color: color,
fontSize: fontSize,
fontWeight: fontWeight,
),
);
}
}
方式二
优点:
不用暴露太多属性,直接暴露一个 textStyle 属性,需要用到 text 的什么属性,使用者自己传入 textStyle 即可。
缺点:
一旦 Widget 使用者,需要传入 textStyle 自定义部分样式,会丢失预设的 textStyle 所有默认样式,所有样式都需要重新传,对于只改其中单个或少数几个样式来说,很不方便。
这里预设了颜色、字号、字重这三个样式属性,使用者如果仅仅需要修改颜色,那在将自定义 color 传入 textStyle 的同时,还要传入字号、字重这俩属性默认的值。
这里预设样式比较少还好。如果预设样式列表特别长,有十几个甚至更多属性,为了自定义其中一个属性的样式,需要重新传所有样式,就很难受很不友好。
class TextWidget extends StatelessWidget {
final String text;
final TextStyle textStyle;
const TextWidget({
Key? key,
required this.text,
this.textStyle = const TextStyle(
color: Colors.black,
fontSize: 16,
fontWeight: FontWeight.normal,
),
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(text, style: textStyle);
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.