原範例是直接用文字的方式呈現,下面是改成透過 DataTable 元件以表格方式呈現。
(以下為新增和修改的 .dart 程式檔案)
component/post_table.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:webservice_client/models/post.dart';
// ignore: must_be_immutable
class PostTable extends StatelessWidget {
PostTable(this.posts, {super.key});
List<Post> posts;
@override
Widget build(BuildContext context) {
// Convert object variables to data column list
List<String> columnNames = (jsonDecode(posts[0].toJsonObjectString()) as Map<String, dynamic>).keys.toList();
List<DataColumn> dataColumns = columnNames.map((key) {
return DataColumn(label: Text(key));
},).toList();
// Convert object variables to data row list
List<DataRow> dataRows = posts.map((post) {
Map<String, dynamic> postJson = jsonDecode(post.toJsonObjectString()) as Map<String, dynamic>;
List<DataCell> dataCells = columnNames.map((key){
return DataCell(
Text(postJson[key].toString()));
}).toList();
return DataRow(cells: dataCells);
},).toList();
return DataTable(columns: dataColumns, rows: dataRows);
}
}
screen/post_screen.dart
import 'package:flutter/material.dart';
import 'package:webservice_client/components/post_table.dart';
import 'package:webservice_client/daos/post_dao.dart';
import 'package:webservice_client/models/post.dart';
class PostScreen extends StatelessWidget {
const PostScreen({super.key});
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: PostDao.getPosts(),
builder: (BuildContext context, AsyncSnapshot<List<Post>> asyncSnapshot) {
return Scaffold(
body: PostTable(asyncSnapshot.requireData),
);
}
);
}
}


Leave a comment