• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-9-1 00:11:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试更多地了解Flutter。

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

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函数看起来都很相似。有没有一种方法可以简单地编写代码?这样的东西(前面的伪代码):
final type = this.isOutline ? OutlineButton : FlatButton;
return type(shape: ..., color: ..., ...);



Best Answer-推荐答案


您可以像这样共享许多通用代码:

  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,
          );
  }

关于dart - 确定在运行时构造哪种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55052842/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap