确定在运行时构造哪种类型

时间:2019-03-07 21:10:34

标签: dart flutter

我正试图让Flutter变得更多。

我有一个按钮类,可以根据参数构建p2FlatButton

OutlineButton

如您所见,两个import 'package:flutter/material.dart'; class Button extends StatelessWidget { final String text; final VoidCallback onPressed; final Color backgroundColor; final Color textColor; final bool isOutline; Button( {@required this.text, @required this.onPressed, this.backgroundColor = Colors.deepOrange, this.textColor = Colors.white, this.isOutline = false}); @override Widget build(BuildContext context) { return this.isOutline ? _buildOutlineButton(context) : _buildFlatButton(context); } FlatButton _buildFlatButton(BuildContext context) { return FlatButton( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), color: this.backgroundColor, onPressed: this.onPressed, child: Container( padding: const EdgeInsets.symmetric( vertical: 20.0, horizontal: 20.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child: Text( this.text, textAlign: TextAlign.center, style: TextStyle(color: this.textColor, fontWeight: FontWeight.bold), ), ), ], ), ), ); } OutlineButton _buildOutlineButton(BuildContext context) { return OutlineButton( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), color: this.backgroundColor, onPressed: this.onPressed, child: Container( padding: const EdgeInsets.symmetric( vertical: 20.0, horizontal: 20.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child: Text( this.text, textAlign: TextAlign.center, style: TextStyle(color: this.textColor, fontWeight: FontWeight.bold), ), ), ], ), ), ); } } 函数看起来很相似。有没有一种方法可以简单地编写代码?这样的东西(前面是伪代码):

_build*Button

1 个答案:

答案 0 :(得分:3)

您可以共享许多通用代码,如下所示:

  MaterialButton _buildButton(bool flat, BuildContext context) {
    Container container = Container(
      padding: const EdgeInsets.symmetric(
        vertical: 20.0,
        horizontal: 20.0,
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: Text(
              text,
              textAlign: TextAlign.center,
              style: TextStyle(color: textColor, fontWeight: FontWeight.bold),
            ),
          ),
        ],
      ),
    );
    RoundedRectangleBorder border = RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(30.0),
    );
    return flat
        ? FlatButton(
            shape: border,
            color: backgroundColor,
            onPressed: onPressed,
            child: container,
          )
        : RaisedButton(
            shape: border,
            color: backgroundColor,
            onPressed: onPressed,
            child: container,
          );
  }