如何在颤振中正确重用小部件样式?

oem*_*era 7 dart flutter flutter-layout

来自 angular、react 和 vue 等前端网络框架,我正在努力寻找编写可重用小部件样式的最佳方法。让我用一个例子来演示这个问题。

假设我们有这个小部件:

Container(
  width: 25,
  height: 10,
  decoration: BoxDecoration(
    color: const Color(0xff7c94b6),
    border: Border.all(
      color: Colors.black,
      width: 8.0,
      ),
    ),
  child: /* some custom widget */,
);
Run Code Online (Sandbox Code Playgroud)

现在可以说,我想做出Container类似性质widthheight通过参数等多变。如果某个属性的某个参数未传递,则应使用其默认值,如下所示:

class CustomWidget extends StatelessWidget {
  final double width;
  final double height;
  final BoxDecoration decoration;

  const CustomWidget ({
    Key key,
    this.width = 25,
    this.height = 10,
    this.decoration = /* default decoration */
    /* possibly even more properties */
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: width,
      height: height,
      decoration: decoration,
      child: /* some custom widget */
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,可能有更多的属性会导致越来越多的样板。如果容器默认没有装饰,你会怎么做?您应该始终传递自定义容器吗?还要考虑到 Container 可以嵌套在小部件树的更下方。

一定有好的解决方案,我就是想不出来,可能是因为我的前端开发经验导致我的想法有偏见。在 web 项目中,您只需传递组件/小部件自定义 css-classes 来覆盖样式(例如参数containerClasses)。你如何在颤振中正确地做到这一点?

编辑:本质上我的问题是:flutter 中是否有与 css-class 等效的东西?或者:使自定义小部件的样式完全由参数自定义的最佳方法是什么。我觉得我必须手工编写每一个属性。

在反应你有所有的HTML元素(如接口divinput等等)和他们的道具(例如,对于一个input-元素你有一个接口valueclasstype等),你可以用它来定义哪些参数可以通过自定义组件/小部件。

Rém*_*let 1

Flutter 样式的行为通常与 Vue 作用域样式/React“样式组件”或 React Native 类似:

这些场景中不存在“全球风格”。相反,您可以使用组合来获得所需的结果。

从某种意义上说,每个“CSS 类”都有一个 StatelessWidget,而不是一个具有许多参数的大型 StatelessWidget。

例如,假设我们想要将“红色背景+边框半径”拆分为可重用的样式,那么我们通常有两个小部件:

  • 红色背景
  • 我的边界

然后您就可以独立使用它们:

RedBackground(
  child: Text('hello world'),
)
Run Code Online (Sandbox Code Playgroud)

或一起:

RedBackground(
  child: MyBorder(
    child: Text('hello world'),
  ),
)
Run Code Online (Sandbox Code Playgroud)