【问题标题】:What is causing the error "Return Type 'TableRow' isn't a 'Widget', as defined by method 'build'"是什么导致错误“返回类型'TableRow'不是'Widget',由方法'build'定义”
【发布时间】:2019-06-20 20:25:00
【问题描述】:

我正在 Flutter/Dart 中创建一个应用程序,我目前正在处理应用程序的布局。我正在尝试创建一个可以完美运行的标准表格布局,直到我想将代码外包到不同的文件中。此时,我创建了一个扩展 StatelessWidget 的类,它覆盖了返回 TableRow 的内置方法。此时,我的 IDE 声称“TableRow”不是“Widget”类型。

我尝试使用不同的方法,如网格布局和一些与行/列有关的技巧,但实际上没有一个是我正在寻找的解决方案。我只是想将代码重构为多个文件。

此代码现在位于单独的文件中。虽然 TableRow 是 Table() 中的直接子级,但它工作得非常好。

import 'package:flutter/material.dart';

class Test extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return TableRow(
            children: [
                TableCell(
                    child: Text("test"),
                ),
            ]
        )
    }
}

我从中调用方法的文件看起来像这样:

Container(
     constraints: BoxConstraints(minWidth: 250, maxWidth: 300, maxHeight: 300),
     child: Table(
         children: [
             Test(),
             Test(),
             Test(),
             Test(),
         ],
     ),
 ),

我只是希望 TableRow 像其他所有东西一样被识别为普通的 Widget。例如 TableCell 被识别为 Widget。我得到的错误消息是“错误:返回类型'TableRow'不是'Widget',由方法'build'定义。(return_of_invalid_type at [projectname] lib/widgets/auth/shared/test.dart: 12)"。该错误发生在编译之前并被 Android Studio 标记。

编辑:添加代码调用

【问题讨论】:

  • 这是您使用的确切代码吗?您缺少 TableCell 的“子”参数。
  • 嗨,不是,抱歉。我将其编辑到原始帖子中,因此现在更有意义。感谢您指出这一点!
  • 我明白了,你能解释一下你的理由吗?为什么你需要一个 tablerow 小部件,而你可以只拥有一个返回 tablerow 的简单方法?
  • 我想遵循“一切都是小部件”的设计。基本上为所有包含信息的东西创建一个小部件。在我的代码中,有一个构造函数保存附加值,例如将写入的文本而不是“测试”。我只是想简化代码以便更好地理解。
  • 我明白,我会说这太过分了。

标签: flutter dart


【解决方案1】:

错误消息告诉您出了什么问题:TableRow 不是 Widget

如果您查看TableRow documentation,请注意没有“继承”部分表明它派生自Widget

如果您查看Table documentation,请注意childrenList<TableRow>不是 List<Widget>

“一切都是小部件”是一种夸张的说法,旨在让人们考虑将他们的 UI 分解为可组合的小部件。显然有些东西不是Widgets (int, String, Function, Element, RenderObject, ...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2011-05-19
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多