Flutter JSON数据展示插件json_table的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter JSON数据展示插件json_table的使用

json_table 是一个用于在Flutter应用中直接从JSON数据生成表格的插件。它支持列切换、自定义列、嵌套数据展示和分页等功能。

特性

  • 手动编码实现,便于学习如何创建简单的表格。
  • 支持垂直和水平滚动。
  • 支持自定义列,包括默认值、列名、值构建器。
  • 支持嵌套数据展示。
  • 支持分页。
  • 支持行选择颜色和回调。

安装

pubspec.yaml 文件的 dependencies: 部分添加以下内容:

dependencies:
  json_table: ^最新版本号

使用方法

导入类

首先需要导入 json_table 包:

import 'package:json_table/json_table.dart';

基本实现

解码你的JSON字符串并传递给 JsonTable 小部件:

final String jsonSample = '[{"id":1},{"id":2}]';
var json = jsonDecode(jsonSample);

// 直接传递 JSON 数据
child: JsonTable(json)

自定义表头和单元格构建器

可以通过 tableHeaderBuildertableCellBuilder 来自定义表头和单元格的显示效果:

JsonTable(
   json,
   tableHeaderBuilder: (String header) {
     return Container(
       padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
       decoration: BoxDecoration(border: Border.all(width: 0.5), color: Colors.grey[300]),
       child: Text(
         header,
         textAlign: TextAlign.center,
         style: Theme.of(context).textTheme.display1.copyWith(fontWeight: FontWeight.w700, fontSize: 14.0, color: Colors.black87),
       ),
     );
   },
   tableCellBuilder: (value) {
     return Container(
       padding: EdgeInsets.symmetric(horizontal: 4.0, vertical: 2.0),
       decoration: BoxDecoration(border: Border.all(width: 0.5, color: Colors.grey.withOpacity(0.5))),
       child: Text(
         value,
         textAlign: TextAlign.center,
         style: Theme.of(context).textTheme.display1.copyWith(fontSize: 14.0, color: Colors.grey[900]),
       ),
     );
   },
)

自定义列列表

通过传递自定义列列表来控制显示哪些列:

final String jsonSample = '[{"name":"Ram","email":"ram@gmail.com","age":23,"DOB":"1990-12-01"},'
                          '{"name":"Shyam","email":"shyam23@gmail.com","age":18,"DOB":"1995-07-01"},'
                          '{"name":"John","email":"john@gmail.com","age":10,"DOB":"2000-02-24"},'
                          '{"name":"Ram","age":12,"DOB":"2000-02-01"}]';
var json = jsonDecode(jsonSample);

var columns = [
  JsonTableColumn("name", label: "Name"),
  JsonTableColumn("age", label: "Age"),
  JsonTableColumn("DOB", label: "Date of Birth", valueBuilder: formatDOB),
  JsonTableColumn("age", label: "Eligible to Vote", valueBuilder: eligibleToVote),
  JsonTableColumn("email", label: "E-mail", defaultValue: "NA"),
];

// 示例格式化函数
String eligibleToVote(value) {
  if (value >= 18) {
    return "Yes";
  } else
    return "No";
}

child: JsonTable(json, columns: columns)

嵌套数据列表

对于包含嵌套数据的JSON对象,可以使用点号访问嵌套字段:

final String jsonSample = '[{"name":"Ram","email":{"1":"ram@gmail.com"},"age":23,"DOB":"1990-12-01"},'
                           '{"name":"Shyam","email":{"1":"shyam23@gmail.com"},"age":18,"DOB":"1995-07-01"},'
                           '{"name":"John","email":{"1":"john@gmail.com"},"age":10,"DOB":"2000-02-24"}]';
var json = jsonDecode(jsonSample);

var columns = [
  JsonTableColumn("name", label: "Name"),
  JsonTableColumn("age", label: "Age"),
  JsonTableColumn("DOB", label: "Date of Birth", valueBuilder: formatDOB),
  JsonTableColumn("age", label: "Eligible to Vote", valueBuilder: eligibleToVote),
  JsonTableColumn("email.1", label: "E-mail", defaultValue: "NA"),
];

child: JsonTable(json, columns: columns)

列切换和行高亮

可以通过设置 showColumnToggle 实现列切换功能,并通过 allowRowHighlightrowHighlightColor 设置行高亮效果:

JsonTable(
  json,
  showColumnToggle: true,
  allowRowHighlight: true,
  rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
  onRowSelect: (index, map) {
    print(index);
    print(map);
  },
  paginationRowCount: 4,
  columns: columns,
)

示例应用

下面是一个完整的示例应用,展示了如何使用 json_table 插件:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:json_table/json_table.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Json Table Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String jsonSample = '[{"name":"Ram","email":"ram@gmail.com","age":23,"DOB":"1990-12-01"},'
                            '{"name":"Shyam","email":"shyam23@gmail.com","age":18,"DOB":"1995-07-01"},'
                            '{"name":"John","email":"john@gmail.com","age":10,"DOB":"2000-02-24"},'
                            '{"name":"Ram","age":12,"DOB":"2000-02-01"}]';

  var json;
  bool toggle = false;

  @override
  void initState() {
    super.initState();
    json = jsonDecode(jsonSample);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Json Table Example'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Text(
                  'Show/Hide Columns',
                  style: Theme.of(context).textTheme.subtitle1,
                ),
                Switch(
                  onChanged: toggleSwitch,
                  value: toggle,
                ),
              ],
            ),
            JsonTable(
              json,
              columns: [
                JsonTableColumn("name", label: "Name"),
                JsonTableColumn("age", label: "Age"),
                JsonTableColumn("DOB", label: "Date of Birth"),
                JsonTableColumn("email", label: "E-mail", defaultValue: "NA"),
              ],
              showColumnToggle: true,
              allowRowHighlight: true,
              rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
              onRowSelect: (index, map) {
                print(index);
                print(map);
              },
            ),
          ],
        ),
      ),
    );
  }

  void toggleSwitch(bool value) {
    setState(() {
      toggle = value;
    });
  }
}

这个示例展示了如何使用 json_table 插件来解析和展示JSON数据,并提供了基本的交互功能如列切换和行高亮。

更多详细信息和示例代码请参考 GitHub


更多关于Flutter JSON数据展示插件json_table的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON数据展示插件json_table的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,json_table 是一个用于在 Flutter 应用中展示 JSON 数据的插件。虽然它不是 Flutter 官方生态系统中的一个非常流行的插件,但假设你已经找到了一个合适的第三方包来实现这个功能,我们可以展示如何使用这个包来展示 JSON 数据。

以下是一个示例,展示了如何在 Flutter 应用中使用 json_table(或类似的插件)来展示 JSON 数据。需要注意的是,由于 json_table 并不是 Flutter 官方插件,具体的实现和 API 可能会有所不同,以下代码是一个假设性的示例,旨在展示一般的用法。

首先,确保你已经在 pubspec.yaml 文件中添加了 json_table(或类似的插件)的依赖:

dependencies:
  flutter:
    sdk: flutter
  json_table: ^x.y.z  # 替换为实际的版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 json_table 来展示 JSON 数据。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:json_table/json_table.dart'; // 假设包名和实际导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter JSON Table Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: JsonTableScreen(),
    );
  }
}

class JsonTableScreen extends StatelessWidget {
  // 示例 JSON 数据
  final Map<String, dynamic> jsonData = {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com",
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "zipcode": "12345"
    },
    "phoneNumbers": [
      {"type": "home", "number": "555-1234"},
      {"type": "work", "number": "555-5678"}
    ]
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('JSON Table Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: JsonTable(
          data: jsonData,
          columns: [
            JsonTableColumn(title: 'Key', dataField: 'key'),
            JsonTableColumn(title: 'Value', dataField: 'value'),
          ],
          expandable: true, // 允许展开嵌套对象
          expandedColumns: [
            JsonTableColumn(title: 'Street', dataField: 'address.street'),
            JsonTableColumn(title: 'City', dataField: 'address.city'),
            JsonTableColumn(title: 'Zipcode', dataField: 'address.zipcode'),
          ],
          // 可以根据需要添加更多列和配置
        ),
      ),
    );
  }
}

// 假设的 JsonTableColumn 类,实际使用时请参考 json_table 插件的文档
class JsonTableColumn {
  final String title;
  final String dataField;

  JsonTableColumn({required this.title, required this.dataField});
}

// 假设的 JsonTable 类,实际使用时请参考 json_table 插件的文档
class JsonTable extends StatefulWidget {
  final Map<String, dynamic> data;
  final List<JsonTableColumn> columns;
  final bool expandable;
  final List<JsonTableColumn> expandedColumns;

  JsonTable({
    required this.data,
    required this.columns,
    this.expandable = false,
    this.expandedColumns = const [],
  });

  @override
  _JsonTableState createState() => _JsonTableState();
}

class _JsonTableState extends State<JsonTable> {
  // 这里省略了具体的实现细节,因为实际的 json_table 插件会有自己的实现方式
  @override
  Widget build(BuildContext context) {
    // 假设的实现,用于展示 JSON 数据
    return DataTable(
      columns: widget.columns.map((column) {
        return DataColumn(label: Text(column.title));
      }).toList(),
      rows: _buildRows(widget.data),
    );
  }

  List<DataRow> _buildRows(Map<String, dynamic> data) {
    // 这里需要根据 json_table 插件的实际 API 来实现
    List<DataRow> rows = [];
    data.forEach((key, value) {
      rows.add(DataRow.byIndex(index: 0, cells: [
        DataCell(Text(key)),
        DataCell(Text(value.toString())),
      ]));
    });
    return rows;
  }
}

注意:上述代码中的 JsonTableColumnJsonTable 类是假设性的实现,用于展示如何使用可能的 API。实际使用时,你需要参考 json_table 插件的文档和 API 来实现。如果 json_table 插件不支持某些功能(如上述示例中的 expandableexpandedColumns),你可能需要寻找其他插件或自己实现这些功能。

此外,如果 json_table 插件不存在或不符合你的需求,你可以考虑使用 DataTable 或其他自定义实现来展示 JSON 数据。

回到顶部