首页 > 解决方案 > 可以扩展一些类并在 build() 中使用它吗?

问题描述

我有一个向用户显示错误的小部件。我想有两种变体:

对于第二个,我想稍微调整布局并Dialog用作包装。所以我创建了一个单独的小部件,它扩展了我当前的小部件,这样我就可以跳过在类中添加重复字段。

class ConnectionErrorDialog extends ConnectionErrorWidget {
  ConnectionErrorDialog(
      {required String errorText,
      required VoidCallback mainButtonOnTap,
      String mainButtonText = 'Понятно'})
      : super(
            errorText: errorText,
            mainButtonText: mainButtonText,
            mainButtonOnTap: mainButtonOnTap);

  @override
  Widget build(BuildContext context) {
    return Dialog(
        elevation: 24.0,
        child: Padding(
          padding: EdgeInsets.all(20.0),
          child: ConnectionErrorWidget(
            errorText: errorText,
            mainButtonOnTap: mainButtonOnTap,
            mainButtonText: mainButtonText,
          ),
        ));
  }
}

class ConnectionErrorWidget extends StatelessWidget {
  ConnectionErrorWidget({
    required this.errorText,
    required this.mainButtonOnTap,
    this.mainButtonText = 'Попробовать снова',
  });

  final String errorText;

  final String mainButtonText;

  final VoidCallback mainButtonOnTap;

  @override
  Widget build(BuildContext context) {
    return UserErrorWidget(
        errorText: errorText,
        mainButtonText: mainButtonText,
        mainButtonOnTap: mainButtonOnTap,
        showAsDialog: false);
  }
}

我想了解,扩展一些类并在 build() 中使用它是否可以?也许还有其他更好的方法可以达到相同的结果?

标签: flutterdart

解决方案


您可以像这样扩展小部件,但唯一的好处是省略字段重复。但看起来你可以做这样的事情:

class ConnectionErrorWidget extends StatelessWidget {
  const ConnectionErrorWidget({
    @required this.errorText,
    @required this.mainButtonOnTap,
    this.mainButtonText,
    this.showAsDialog = false,
  });

  final bool showAsDialog;
  final String errorText;
  final String mainButtonText;
  final VoidCallback mainButtonOnTap;

  @override
  Widget build(BuildContext context) {
    if (showAsDialog) {
      return Dialog(
          elevation: 24.0,
          child: Padding(
            padding: const EdgeInsets.all(20.0),
            child: _buildUserError(),
          ));
    }
    return _buildUserError();
  }

  Widget _buildUserError() {
    return UserErrorWidget(
        errorText: errorText,
        mainButtonText: mainButtonText ?? (showAsDialog ? 'Попробовать снова' : 'Понятно'),
        mainButtonOnTap: mainButtonOnTap,
        showAsDialog: showAsDialog);
  }
}

在这种情况下,除了省略字段重复之外,您的好处是省略了构造函数参数。我认为这些变体之间没有太大区别,您可以使用您更喜欢的任何变体。


推荐阅读