Flutter Dart/FLATTER-将json嵌套到数据表

Flutter Dart/FLATTER-将json嵌套到数据表,flutter,dart,Flutter,Dart,我试图将以下json放入一个数据表(CFTable)。json的结构是map>。我有一个COA类来处理内部映射(map),还有一个TransposedCF类来从该映射(map)生成映射。我不想硬编码外部地图(“采集”、“BP提升”…等)或内部地图(“2019”、“2020”…等)的字符串键,因为它们会不断变化。我对TransposeCf类的fromJson方法有困难(因此?) 另外,在我构建这个类之后,我想在一个表中使用它,但是那里有很多错误 JSON: 颤振: import 'package:

我试图将以下json放入一个数据表(CFTable)。json的结构是map>。我有一个COA类来处理内部映射(map),还有一个TransposedCF类来从该映射(map)生成映射。我不想硬编码外部地图(“采集”、“BP提升”…等)或内部地图(“2019”、“2020”…等)的字符串键,因为它们会不断变化。我对TransposeCf类的fromJson方法有困难(因此?)

另外,在我构建这个类之后,我想在一个表中使用它,但是那里有很多错误

JSON:

颤振:

import 'package:flutter/material.dart';

class COA {
  final Map<String, double> values;

  const COA({@required this.values});

  factory COA.fromJson(Map json) {
    final values = json['values'];
    return COA(values: values);
  }
}

class TransposedCF {
  final String assetname;
  final Map<String, COA> coas;

  TransposedCF({this.assetname, this.coas});

  factory TransposedCF.fromJson(String name, List json) {
    return TransposedCF(
      assetname: name,
      coas: ?,
    );
  }
}

class CFTable extends StatelessWidget {
  final TransposedCF cf;

  CFTable({Key key, this.cf}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text("OGANICA"),
        DataTable(columns: _buildColumns(), rows: _buildDataRows()),
      ],
    );
  }

  List<DataColumn> _buildColumns() {
    final years = cf.coas.first.values.keys.toList()..sort();
    return [
      DataColumn(label: Text(cf.assetname)),
      for (String year in years) DataColumn(label: Text("$year"))
    ];
  }

  List<DataRow> _buildDataRows() {
    return cf.coas.map<DataRow>((coa) {
      final years = coa.values.keys.toList()..sort();
      return DataRow(cells: [
        DataCell(Text(coa.name)),
        ...years.map<DataCell>((year) {
          final value = coa.values[year];
          //TODO format value
          return DataCell(Text(value.toString()));
        })
      ]);
    }).toList(growable: false);
  }
}
导入“包装:颤振/材料.省道”;
COA类{
最终地图值;
const COA({@required this.values});
工厂COA.fromJson(映射json){
最终值=json['values'];
返回COA(值:值);
}
}
类转置{
最终字符串资产名称;
最终地图coas;
TransposedCF({this.assetname,this.coas});
factory TransposedCF.fromJson(字符串名称,列表json){
回程转置(
资产名称:名称,
coas:?,
);
}
}
类CFTable扩展了无状态小部件{
最终转座cf;
CFTable({Key-Key,this.cf}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
文本(“OGANICA”),
数据表(列:_buildColumns(),行:_buildDataRows()),
],
);
}
列表_buildColumns(){
最后年份=cf.coas.first.values.keys.toList()…sort();
返回[
DataColumn(标签:Text(cf.assetname)),
对于(以年为单位的字符串年份)数据列(标签:文本($year))
];
}
列表_buildDataRows(){
返回cf.coas.map((coa){
最后年份=coa.values.keys.toList()…sort();
返回数据行(单元格:[
数据单元(文本(coa.name)),
…年。地图((年){
最终价值=成本价值[年度];
//TODO格式值
返回数据单元(文本(value.toString());
})
]);
}).toList(可增长:假);
}
}

您可以复制粘贴运行下面的完整代码
步骤1:在本演示中,将原始json字符串使用到相关映射
有效负载

步骤2:将此
有效载荷
传输到
年度数据列表

步骤3:使用
json_table
使用
列表
年度数据

工作演示

代码片段

class Payload {
  Map<String, double> acquisition;
  Map<String, double> bpUplift;
  Map<String, double> capex;
...  
class YearData {
  String year;
  double acquisition;
  double bpUplift;
  double capex;  
...  
void transfer() {
    Payload payload = payloadFromJson(jsonString);
    List<YearData> yearDataList = [];

    for (var val in payload.acquisition.keys) {
      var year = val;
      var acquisition = payload.acquisition[val];
      var capex = payload.capex[val];
      var bpUplift = payload.bpUplift[val];
      yearDataList.add(YearData(
          year: year,
          acquisition: acquisition,
          bpUplift: bpUplift,
          capex: capex));
    }

    jsonSample = yearDataToJson(yearDataList);
}  
类有效载荷{
地图采集;
地图;地形抬升;
Map资本支出;
...  
类年数据{
弦年;
双重收购;
双重抬升;
双重资本支出;
...  
无效转让(){
有效载荷=payloadFromJson(jsonString);
列表年份数据列表=[];
for(有效载荷.acquisition.keys中的var val){
var年=val;
var采集=有效载荷。采集[val];
var资本支出=有效载荷。资本支出[val];
var BPUpgration=有效载荷。BPUpgration[val];
yearDataList.add(YearData(
年份:年份,,
收购:收购,
bpuplation:bpuplation,
资本支出:资本支出);
}
jsonSample=yearDataToJson(yearDataList);
}  
完整代码

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

import 'dart:convert';

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  Map<String, double> acquisition;
  Map<String, double> bpUplift;
  Map<String, double> capex;

  Payload({
    this.acquisition,
    this.bpUplift,
    this.capex,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
        acquisition: Map.from(json["Acquisition"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
        bpUplift: Map.from(json["BP Uplift"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
        capex: Map.from(json["Capex"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
      );

  Map<String, dynamic> toJson() => {
        "Acquisition": Map.from(acquisition)
            .map((k, v) => MapEntry<String, dynamic>(k, v)),
        "BP Uplift":
            Map.from(bpUplift).map((k, v) => MapEntry<String, dynamic>(k, v)),
        "Capex": Map.from(capex).map((k, v) => MapEntry<String, dynamic>(k, v)),
      };
}

List<YearData> yearDataFromJson(String str) =>
    List<YearData>.from(json.decode(str).map((x) => YearData.fromJson(x)));

String yearDataToJson(List<YearData> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class YearData {
  String year;
  double acquisition;
  double bpUplift;
  double capex;

  YearData({
    this.year,
    this.acquisition,
    this.bpUplift,
    this.capex,
  });

  factory YearData.fromJson(Map<String, dynamic> json) => YearData(
        year: json["year"],
        acquisition: json["Acquisition"],
        bpUplift: json["BPUplift"],
        capex: json["Capex"],
      );

  Map<String, dynamic> toJson() => {
        "year": year,
        "Acquisition": acquisition,
        "BPUplift": bpUplift,
        "Capex": capex,
      };
}

class SimpleTable extends StatefulWidget {
  @override
  _SimpleTableState createState() => _SimpleTableState();
}

class _SimpleTableState extends State<SimpleTable> {
  String jsonString = '''
  {
  "Acquisition": {
    "2019": -78600000,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 77527013.89465855
  },
  "BP Uplift": {
    "2019": 0,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 0
  },
  "Capex": {
    "2019": 0,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 0
  }
}
  ''';
  String jsonSample = "";

  bool toggle = true;
  List<YearData> yearDataList = [];

  @override
  void initState() {
    // TODO: implement initState
    transfer();
    super.initState();
  }

  void transfer() {
    Payload payload = payloadFromJson(jsonString);
    List<YearData> yearDataList = [];

    for (var val in payload.acquisition.keys) {
      var year = val;
      var acquisition = payload.acquisition[val];
      var capex = payload.capex[val];
      var bpUplift = payload.bpUplift[val];
      yearDataList.add(YearData(
          year: year,
          acquisition: acquisition,
          bpUplift: bpUplift,
          capex: capex));
    }

    jsonSample = yearDataToJson(yearDataList);
  }

  @override
  Widget build(BuildContext context) {
    var json = jsonDecode(jsonSample);
    return Scaffold(
      body: Container(
        padding: EdgeInsets.all(16.0),
        child: toggle
            ? Column(
                children: [
                  JsonTable(
                    json,
                    showColumnToggle: true,
                    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]),
                        ),
                      );
                    },
                    allowRowHighlight: true,
                    rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
                    paginationRowCount: 20,
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  Text("Simple table which creates table direclty from json")
                ],
              )
            : Center(
                child: Text(getPrettyJSONString(jsonSample)),
              ),
      ),
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.grid_on),
          onPressed: () {
            setState(
              () {
                toggle = !toggle;
              },
            );
          }),
    );
  }

  String getPrettyJSONString(jsonObject) {
    JsonEncoder encoder = new JsonEncoder.withIndent('  ');
    String jsonString = encoder.convert(json.decode(jsonObject));
    return jsonString;
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SimpleTable(),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“dart:convert”;
导入“package:json_table/json_table.dart”;
导入“dart:convert”;
Payload payloadFromJson(String str)=>Payload.fromJson(json.decode(str));
字符串payloadToJson(有效负载数据)=>json.encode(data.toJson());
类有效载荷{
地图采集;
地图;地形抬升;
Map资本支出;
有效载荷({
这个收购,,
这个,这个,,
这是资本支出,
});
工厂负载.fromJson(映射json)=>负载(
acquisition:Map.from(json[“acquisition”])
.map((k,v)=>MapEntry(k,v.toDouble()),
bpuplation:Map.from(json[“BP uplation”])
.map((k,v)=>MapEntry(k,v.toDouble()),
资本支出:Map.from(json[“资本支出”])
.map((k,v)=>MapEntry(k,v.toDouble()),
);
映射到JSON()=>{
“采集”:地图来源(采集)
.map((k,v)=>MapEntry(k,v)),
“BP提升”:
Map.from(bpuplation).Map((k,v)=>MapEntry(k,v)),
“资本支出”:映射自(资本支出).Map((k,v)=>MapEntry(k,v)),
};
}
List yearDataFromJson(字符串str)=>
List.from(json.decode(str.map)(x)=>YearData.fromJson(x));
字符串yearDataToJson(列表数据)=>
encode(List.from(data.map((x)=>x.toJson());
类年数据{
弦年;
双重收购;
双重抬升;
双重资本支出;
年度数据({
今年,,
这个收购,,
这个,这个,,
这是资本支出,
});
factory YearData.fromJson(映射json)=>YearData(
年份:json[“年份”],
收购:json[“收购”],
bpuplation:json[“bpuplation”],
资本支出:json[“资本支出”],
);
映射到JSON()=>{
“年”:年,
“收购”:收购,
“BPUpgration”:BPUpgration,
“资本支出”:资本支出,
};
}
类SimpleTable扩展StatefulWidget{
@凌驾
_SimpleTableState createState()=>_SimpleTableState();
}
类_SimpleTableState扩展了状态{
字符串jsonString='''
{
“收购”:{
"2019": -78600000,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 77527013.89465855
},
“BP提升”:{
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
},
“资本支出”:{
"2019": 0,
"2020": 0,
"2021": 0,
"2022": 0,
"2023": 0,
"2024": 0,
"2025": 0,
"2026": 0,
"2027": 0,
"2028": 0,
"2029": 0,
"2030": 0
}
}
''';
字符串jsonSample=“”;
布尔切换=真;
列表年份数据列表=[];
@凌驾
void initState(){
//TODO:实现initState
转移();
super.initState();
}
无效转让(){
有效载荷=payloadFromJson(jsonString);
罗列年度数据
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:json_table/json_table.dart';

import 'dart:convert';

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  Map<String, double> acquisition;
  Map<String, double> bpUplift;
  Map<String, double> capex;

  Payload({
    this.acquisition,
    this.bpUplift,
    this.capex,
  });

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
        acquisition: Map.from(json["Acquisition"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
        bpUplift: Map.from(json["BP Uplift"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
        capex: Map.from(json["Capex"])
            .map((k, v) => MapEntry<String, double>(k, v.toDouble())),
      );

  Map<String, dynamic> toJson() => {
        "Acquisition": Map.from(acquisition)
            .map((k, v) => MapEntry<String, dynamic>(k, v)),
        "BP Uplift":
            Map.from(bpUplift).map((k, v) => MapEntry<String, dynamic>(k, v)),
        "Capex": Map.from(capex).map((k, v) => MapEntry<String, dynamic>(k, v)),
      };
}

List<YearData> yearDataFromJson(String str) =>
    List<YearData>.from(json.decode(str).map((x) => YearData.fromJson(x)));

String yearDataToJson(List<YearData> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class YearData {
  String year;
  double acquisition;
  double bpUplift;
  double capex;

  YearData({
    this.year,
    this.acquisition,
    this.bpUplift,
    this.capex,
  });

  factory YearData.fromJson(Map<String, dynamic> json) => YearData(
        year: json["year"],
        acquisition: json["Acquisition"],
        bpUplift: json["BPUplift"],
        capex: json["Capex"],
      );

  Map<String, dynamic> toJson() => {
        "year": year,
        "Acquisition": acquisition,
        "BPUplift": bpUplift,
        "Capex": capex,
      };
}

class SimpleTable extends StatefulWidget {
  @override
  _SimpleTableState createState() => _SimpleTableState();
}

class _SimpleTableState extends State<SimpleTable> {
  String jsonString = '''
  {
  "Acquisition": {
    "2019": -78600000,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 77527013.89465855
  },
  "BP Uplift": {
    "2019": 0,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 0
  },
  "Capex": {
    "2019": 0,
    "2020": 0,
    "2021": 0,
    "2022": 0,
    "2023": 0,
    "2024": 0,
    "2025": 0,
    "2026": 0,
    "2027": 0,
    "2028": 0,
    "2029": 0,
    "2030": 0
  }
}
  ''';
  String jsonSample = "";

  bool toggle = true;
  List<YearData> yearDataList = [];

  @override
  void initState() {
    // TODO: implement initState
    transfer();
    super.initState();
  }

  void transfer() {
    Payload payload = payloadFromJson(jsonString);
    List<YearData> yearDataList = [];

    for (var val in payload.acquisition.keys) {
      var year = val;
      var acquisition = payload.acquisition[val];
      var capex = payload.capex[val];
      var bpUplift = payload.bpUplift[val];
      yearDataList.add(YearData(
          year: year,
          acquisition: acquisition,
          bpUplift: bpUplift,
          capex: capex));
    }

    jsonSample = yearDataToJson(yearDataList);
  }

  @override
  Widget build(BuildContext context) {
    var json = jsonDecode(jsonSample);
    return Scaffold(
      body: Container(
        padding: EdgeInsets.all(16.0),
        child: toggle
            ? Column(
                children: [
                  JsonTable(
                    json,
                    showColumnToggle: true,
                    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]),
                        ),
                      );
                    },
                    allowRowHighlight: true,
                    rowHighlightColor: Colors.yellow[500].withOpacity(0.7),
                    paginationRowCount: 20,
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  Text("Simple table which creates table direclty from json")
                ],
              )
            : Center(
                child: Text(getPrettyJSONString(jsonSample)),
              ),
      ),
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.grid_on),
          onPressed: () {
            setState(
              () {
                toggle = !toggle;
              },
            );
          }),
    );
  }

  String getPrettyJSONString(jsonObject) {
    JsonEncoder encoder = new JsonEncoder.withIndent('  ');
    String jsonString = encoder.convert(json.decode(jsonObject));
    return jsonString;
  }
}

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

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