子类扩展StatelessWidget或StatefulWidget类的类

时间:2018-07-23 10:06:12

标签: flutter

是否可以创建一个扩展了StatelessWidget或StatefulWidget的类的类。

例如:

class MyButton extends StatelessWidget {
final String label;
Button({this.label});
@override
Widget build(BuildContext context) {
    return ButtonExample("label");}
}

然后

class SubmitButton extends MyButton
{
   String label;
   SubmitButton({Key key, this.label}) : super(label: label);

// then somehow extend the parent build and change only the color
// or in case of StatefulWidget change a functionality
}

我尝试在线搜索示例,但没有成功。

4 个答案:

答案 0 :(得分:4)

在Flutter中,组合优先于继承。
小部件不应该扩展,这就是为什么没有示例或教程来实现它的原因。

Flutter非常注重合成,所包含的窗口小部件库包含许多做得很好的较小的窗口小部件,这些窗口小部件可以通过许多不同方式将它们组合为自定义窗口小部件。

答案 1 :(得分:2)

正如Gunter所说,扑动使用的是继承而非继承。

官方消息:flutter faq

  

Flutter拥有组成功能,而不是让每个小部件提供大量参数。窗口小部件由较小的窗口小部件构建而成,您可以重用这些小窗口小部件,并以新颖的方式组合以创建自定义窗口小部件。例如,RaisedButton不会将通用按钮小部件归类,而是将Material小部件与GestureDetector小部件组合在一起。 “材质”小部件提供视觉设计,而“手势手势”部件提供交互设计。

这意味着您应该创建一个较小的小部件,然后重用,而不是扩展一个小部件。

一个实际的例子是一个基本按钮:

class MyButton extends StatelessWidget {
  final Color color;

  MyButton({this.color = Colors.grey, Key key}): super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: color,
      child: Text("My Button"),
    );
  }
}

然后使用合成功能重复使用以创建更特定类型的按钮:

class OutlineButton extends StatelessWidget {
  final Color color;

  OutlineButton({this.color = Colors.grey, Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
      decoration: BoxDecoration(
        border: Border.all(
          color: color,
          width: 2.0,
          style: BorderStyle.solid,
        ),
      ),
      child: MyButton(
        color: color,
      ),
    );
  }
}

答案 2 :(得分:1)

如果您强烈需要扩展已经扩展StatefulWidget的小部件,则可以执行以下操作:

class WidgetFoo extends StatefulWidget {
  final String varFromFoo = 'foo';
  @override
  State<StatefulWidget> createState() => WidgetFooState<WidgetFoo>();
}

// Don't make this class name private (beginning with _) to allow its usage in other modules.
class WidgetFooState <T extends StatefulWidget> extends State<T> {
  String varFromFooState = 'foo state';
  @override
  Widget build(BuildContext context) {
    return Text(getText());
  }

  String getText() {
    return 'WidgetFoo';
  }
}

class WidgetBar extends WidgetFoo {
  @override
  State<StatefulWidget> createState() => _WidgetBarState<WidgetBar>();
}

class _WidgetBarState extends WidgetFooState<WidgetBar> {
  @override
  String getText() {
    return 'WidgetBar, ${varFromFooState}, ${widget.varFromFoo}';
  }
}

如果实例化WidgetBar,它将使用祖先的变量呈现WidgetBar, foo state, foo文本。

这不是在Flutter上进行开发的最佳方法,但这仍然是您所提问题的直接答案。无状态小部件的扩展类似。您只需添加返回一些默认值且可以在继承的类中覆盖的方法。那是OOP的经典。

答案 3 :(得分:0)

您可以使用mixins。查看dart文档或flutter文档,了解如何使用它们。使用mixins,可以将属性/功能添加到现有类中。您已经在动画控制器中看到了一个示例。