flutter - 颤振列表视图构建器中的动态 JSON 数组
问题描述
我有一个具有以下结构的 JSON 响应。
[
{
"branch": "B1",
"xyz": "0",
"ABC": "2",
"MN": "2"
},
{
"branch": "B2",
"xyz": "0",
"ABC": "0",
"MN": "0"
},
]
在此,只有分支是恒定的。键的数量是动态的(表的列名)。根据我的要求,我不断通过添加列来更改表格。我想在我的列表视图中显示这些,每个分支都有一个项目。
我使用了以下列表视图构建器
ListView.builder(
itemCount: snapshot.data?.length ?? 0,
itemBuilder: (BuildContext context, int index) {
var branch= snapshot.data[index]["branch"];// This is fine as branch is constant
return Myownclass(branch:branch,);
}),
如何获取这些动态键(xyx、ABC、MN)及其值并使用自定义小部件显示。
解决方案
我在这里创建了一个 dartpad,所以你可以使用下面的代码。
该代码使用索引进入 json 对象的每个部分,然后将其提供给 MyOwnClass,这是一个有状态的小部件,它从 json 对象(在 makeWidgetChildren 中)提取键并使用提取的键返回小部件列表。并使用键构建 listView。
我还允许在每个对象中使用不同数量的键,以使其尽可能通用。
最后,我更新了我的答案以模拟从另一个来源(例如 API 调用)获取数据。MyApp 中调用的 getJsonResponse() 旨在模拟此调用,以及如何将其传递给 MakeList()
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(body: MakeList(json: getJsonResponse())),
);
}
getJsonResponse(){ return [
{"branch": "B1", "xyz": "0", "ABC": "2", "MN": "2", "XYZ": "2"},
{"branch": "B2", "xyz": "0", "ABC": "0", "MN": "0", "another": "sugar"},
{"branch": "B3", "xyz": "1", "ABC": "1"},
{"branch": "B4", "xyz": "0", "ABC": "5", "MN": "69"},
];}
}
class MakeList extends StatelessWidget {
final List<Map<String,String>> json;
MakeList({this.json});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: json.length,
itemBuilder: (BuildContext context, int index) {
return MyOwnClass(jsonObject: json[index]);
},
);
}
}
class MyOwnClass extends StatefulWidget {
final Map<String, String> jsonObject;
MyOwnClass({this.jsonObject});
@override
_MyOwnClassState createState() => _MyOwnClassState();
}
class _MyOwnClassState extends State<MyOwnClass> {
@override
Widget build(BuildContext context) {
return ListTile(
title: Container(
child: Row(children: makeWidgetChildren(widget.jsonObject)),
),
);
}
List<Widget> makeWidgetChildren(jsonObject) {
List<Widget> children = [];
jsonObject.keys.forEach(
(key) => {
children.add(
Padding(
child: Text('${jsonObject[key]}'), padding: EdgeInsets.all(8.0)),
)
},
);
return children;
}
}
推荐阅读
- docker - Docker Swarm:docker stack 在未标记的图像上部署结果
- python - spacy 使用来自语料库的数据创建新的语言模型
- javascript - 创建以函数为值的 Map 对象
- odata - sapui5 使用 OData 服务批量调用发布数据
- spring - Jhipster - Angular HTTP Get 请求从未执行
- go - 绕过代理
- typescript - 访问 repeat.for 中的 ref 元素
- react-native - React Native:有条件地为不同的“applicationId”风格导入图像
- javascript - 在 HTML 中禁用 tr
- ajax - Jira 发布/获取 API 请求