Flutter:如何显示同一张表中的所有列

Posted

技术标签:

【中文标题】Flutter:如何显示同一张表中的所有列【英文标题】:Flutter: How to display all columns in the same table 【发布时间】:2021-09-26 21:55:48 【问题描述】:

我正在 Dart 中开发一个测试应用程序。该应用程序用于在 000webhost.com 托管的数据库中显示和插入数据

我正在将我的 json 数据显示到我的应用程序的表格中。我希望所有列都在一张桌子内。使用我当前的代码,它显示了一个全新表中的每一列 like shown here:

下面是我项目的相关代码:

class ViewData extends StatelessWidget
  final String url = 'https://fourieristic-thousa.000webhostapp.com/index.code.php?action=view';

  Future<List<dynamic>> fetchData() async 
    var result = await http.get(
      Uri.parse(url),
    );

    print(json.decode(result.body));
    return json.decode(result.body);
  

  // First entry of each column.
  String _test(dynamic test, int index)
    return test[index]['testColumn'];
   

  // Second entry of each column.
  int _test2(dynamic test, int index)
    return json.decode(test[index]['testColumn2']);
  

  // Third entry of each column (Will some day be a delete function)
  int _id(dynamic test, int index)
    return json.decode(test[index]['ID']);
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Test data table'),
      ),
      body: Container(          
        child: FutureBuilder<List<dynamic>>(
          future: fetchData(),
          builder: (BuildContext context, AsyncSnapshot snapshot) 
            if(snapshot.hasData)
              return ListView.builder(
                shrinkWrap: true,
                scrollDirection: Axis.vertical,
                itemCount: snapshot.data.length,
                itemBuilder: (BuildContext context, int index) 
                  return SingleChildScrollView(
                    scrollDirection: Axis.horizontal,
                    child: DataTable(
                      columns: const <DataColumn>[
                        DataColumn(
                          label: Text(
                            'Test',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                        DataColumn(
                          label: Text(
                            'Test2',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                        DataColumn(
                          label: Text(
                            'Delete',
                            style: TextStyle(fontStyle: FontStyle.italic),
                          ),
                        ),
                      ],
                      rows: <DataRow>[
                        DataRow(
                          cells: <DataCell>[
                            DataCell(
                              Text(_test(snapshot.data, index).toString())
                            ),
                            DataCell(
                              Text(_test2(snapshot.data, index).toString())
                            ),
                            DataCell(
                              Text(_id(snapshot.data, index).toString())
                            )
                          ],
                        ),
                      ],
                    ),
                  );
                
              );
             else 
              return Center(child: CircularProgressIndicator());
            
          ,
        ),
      ),
    );
  

我尝试在网上寻找答案,但没有结果。我也尝试过重写我的代码以试图找出其中的任何问题。我理解为什么应用会在单个表格中显示数据,但我找不到解决方法。

【问题讨论】:

【参考方案1】:

你声称知道问题是什么,所以我不会深入,但主要问题是你的ListView.builder;没有理由把它放在那里。相反,您应该将if(snapshot.hasData)return SingleChildScrollView( 之间的代码替换为以下内容:

List<DataRow> dataRows = [];
for (var index = 0; index < snapshot.data.length; index++) 
  dataRows.add(
    DataRow(
      cells: <DataCell>[
        DataCell(
          Text(_test(snapshot.data, index).toString())
        ),
        DataCell(
          Text(_test2(snapshot.data, index).toString())
        ),
        DataCell(
          Text(_id(snapshot.data, index).toString())
        ),
      ],
    ),
  );

然后将dataRows 变量放在DataTablerows: 字段中。你的树最终应该是 Scaffold -> Container -> FutureBuilder -> SingleChildScrollView -> DataTable。这样您就不会为每个条目都建立一个新表。

【讨论】:

这似乎已经解决了问题。非常感谢您的帮助!

以上是关于Flutter:如何显示同一张表中的所有列的主要内容,如果未能解决你的问题,请参考以下文章

同一张表中的 SQL DATE 比较

如何将特定列单元格映射到同一张表中的其他特定列单元格?

如何根据同一张表中的其他列匹配替换空值

sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据

sql如何将一张表中的一列数据分为两列显示

查找列的 MIN / MAX,当同一张表中的其他列 DO / DONT 有 NULL