flutter - 可以扩展一些类并在 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() 中使用它是否可以?也许还有其他更好的方法可以达到相同的结果?
解决方案
您可以像这样扩展小部件,但唯一的好处是省略字段重复。但看起来你可以做这样的事情:
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);
}
}
在这种情况下,除了省略字段重复之外,您的好处是省略了构造函数参数。我认为这些变体之间没有太大区别,您可以使用您更喜欢的任何变体。
推荐阅读
- python - 如何在 Python 中为 POST 请求传递一个查询参数?
- html - Angular 8 中使用 ngFor 的多级下拉菜单
- qt - 无法自动化windeployqt,未找到
- sql - 如何将值插入列并同时引用 Oracle 表中该列的前一个值?
- minio - 迷你吧。我无法运行 minio 集群。在从节点上收到此错误
- python - 如何在网页中基于十六进制字符串模式抓取数据
- c - 赋值表达式隐含的转换
- python - 从头开始实现 numpy 协方差矩阵
- docker - 码头工人群。无法对 docker 堆栈的容器运行 exec,因为“docker 容器列表”找不到容器
- selenium - 为什么 Facebook 帖子抓取在数百个帖子被抓取后变得非常缓慢或停止?