我DataTable
在 Flutter 中遇到了一些布局问题FutureBuilder
,我调用了 API,它自然会像这样显示它:
可以理解,因为我正在构建一个表列表,它将返回多个表。我只想将行映射为列表,列应该保持不变,就像这样:
First Name
因此,列Last Name
和Delete
总是相同的,它只是映射出表格行单元格,如上图第二张所示。
这可以通过在我的示例中DataTable
使用类似来实现吗?FutureBuilder
我已经尝试在单元格中使用未来的构建器,DataRow
因为它的每个孩子DataCell
都是一个小部件,但它看起来真的很可怕,我不确定这是正确的做法......
这是代码:
API 调用:
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'models/names.dart';
Future<List<NameData>> fetchNames() async {
List<NameData> names = List();
final response = await http.get('https://jsonplaceholder.typicode.com/posts');
if (response.statusCode == 200) {
// If the server did return a 200 OK response,
// then parse the JSON.
var namesJson = jsonDecode(response.body);
print(response.body);
for (int i = 0; i < namesJson.length; i++) {
names.add(NameData.fromJson(jsonDecode(response.body)[i]));
}
return names;
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load names');
}
}
名称模型:
import 'package:flutter/foundation.dart';
import 'dart:core';
class NameData extends ChangeNotifier {
final int id;
final int userId;
final String title;
final String body;
NameData({
this.id,
this.userId,
this.title,
this.body,
});
factory NameData.fromJson(Map<String, dynamic> json) {
return NameData(
id: json["id"],
userId: json["userId"],
title: json["title"],
body: json["body"],
);
}
}
以及带有数据表的名称列表:
import 'package:flutter/material.dart';
import 'models/names.dart';
import 'services/name_api.dart';
class NameList extends StatefulWidget {
@override
_NameList createState() => _NameList();
}
class _NameList extends State<NameList> {
Future<List<NameData>> futureNames;
@override
void initState() {
super.initState();
futureNames = fetchNames();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(
height: 600,
child: FutureBuilder<List<NameData>>(
future: futureNames,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
SizedBox(
height: 12.0,
),
Container(
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.all(
Radius.circular(12.0),
),
),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
columns: <DataColumn>[
DataColumn(
label: Text(
'First Name',
style:
TextStyle(fontStyle: FontStyle.italic),
),
),
DataColumn(
label: Text(
'Last Name',
style:
TextStyle(fontStyle: FontStyle.italic),
),
),
DataColumn(
label: Text(
'Delete',
style:
TextStyle(fontStyle: FontStyle.italic),
),
),
],
rows: <DataRow>[
DataRow(
cells: <DataCell>[
DataCell(
Text('${snapshot.data[index].id}')),
DataCell(
Text('${snapshot.data[index].userId}')),
DataCell(Icon(Icons.delete)),
],
),
],
),
),
),
SizedBox(
height: 16.0,
),
],
);
},
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Container();
},
),
),
],
);
}
}
提前感谢您的时间和帮助。