我想用抖动的HTTP POST解析嵌套的json。我编写代码,但ListView.builder中没有显示数据此请求Json:
{
"nomorAccount": "1234567890"
}
此Json嵌套响应
{
"responseCode": "0000",
"responseMessage": "Success",
"tanggal": "20200131",
"jam": "112301",
"content": [
{
"nomorAccount": "1234567890",
"namaPegawai": "DEVELOPMENT",
"statusAccount": "AKTIF",
"jenisAccount": "TABUNGAN",
"produkAccount": "GOLD",
"mataUang": "IDR",
"saldoEfektif": "+100055033221,84",
"saldoBuku": "+100055058221,84"
}
]
}
模型
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
class PostResult {
String responseCode;
String responseMessage;
String tanggal;
String jam;
String nomorAccount;
String namaPegawai;
String statusAccount;
String jenisAccount;
String produkAccount;
String mataUang;
String saldoEfektif;
String saldoBuku;
PostResult({this.responseCode,this.responseMessage,this.tanggal,this.jam,this.nomorAccount,this.namaPegawai,this.statusAccount,this.jenisAccount,this.produkAccount,this.mataUang,this.saldoEfektif,this.saldoBuku});
factory PostResult.createPostResult(Map<String, dynamic> object)
{
return PostResult(
responseCode: object['responseCode'],
responseMessage: object['responseMessage'],
tanggal: object['tanggal'],
jam: object['jam'],
nomorAccount: object['nomorAccount'],
namaPegawai: object['namaPegawai'],
statusAccount: object['statusAccount'],
jenisAccount: object['jenisAccount'],
produkAccount: object['produkAccount'],
mataUang: object['mataUang'],
saldoEfektif:object['saldoEfektif'],
saldoBuku:object['saldoBuku']
);
}
static Future<PostResult> connectToAPI(String nomorAccount) async {
String apiURL = "http://contoh.com/api";
String username = "username";
String password = "12345678";
var bytes = utf8.encode("$username:$password");
var credentials = base64.encode(bytes);
var headers = {
"Content-Type": "application/json",
"Authorization": "Basic $credentials"
};
var requestBody = jsonEncode({ 'nomorAccount': nomorAccount});
http.Response apiResult = await http.post(apiURL, body: requestBody, headers: headers);
if(apiResult.statusCode == 200){
apiResult.body;
} else {
Exception('gagal memuat data');
}
var jsonObject = json.decode(apiResult.body);
//print(jsonObject);
return PostResult.createPostResult(jsonObject);
}
}
和此ui小部件
class CheckBalance extends StatefulWidget {
CheckBalanceState createState() => CheckBalanceState();
}
class CheckBalanceState extends State<CheckBalance> {
PostResult postResult;
@override
Widget build(BuildContext context) {
return new SafeArea(
child: new Scaffold(
appBar: BankMantapAppBar(),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
RaisedButton(
onPressed: (){
PostResult.connectToAPI("0002104252033").then((value){
postResult = value;
setState(() {});
});
},
child: Text('CEK'),
),
],
),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
ListTile(
title: Text('nilai return'),
subtitle: Column(children: <Widget>[
Row(
children: <Widget>[
Text('response code : ', style: TextStyle(fontWeight: FontWeight.bold),),
Text((postResult != null)
? postResult.responseCode
: "Tidak ada data",
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15.0),
),
],
),
Row(
children: <Widget>[
Text('return message : ', style: TextStyle(fontWeight: FontWeight.bold),),
Text((postResult != null)
? postResult.responseMessage
: "Tidak ada data",
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15.0),
),
],
),
Row(
children: <Widget>[
Text('return tanggal : ', style: TextStyle(fontWeight: FontWeight.bold),),
Text((postResult != null)
? postResult.tanggal
: "Tidak ada data",
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15.0),
),
],
),
Row(
children: <Widget>[
Text('return jam : ', style: TextStyle(fontWeight: FontWeight.bold),),
Text((postResult != null)
? postResult.jam
: "Tidak ada data",
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15.0),
),
],
),
Row(
children: <Widget>[
Text('return nomorAccount : ', style: TextStyle(fontWeight: FontWeight.bold),),
Text((postResult != null)
? postResult.nomorAccount
: "Tidak ada data",
style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15.0),
),
],
),
],),
),
],
),
)
],
),
),
),
)
);
}
}
这是我的错误代码
A non-null String must be provided to a Text widget. 'package:flutter/directory/widgets/text.dart': Failed assertion: line 28510: 'data != null'
我想做的不是提供值,而是希望它从POST请求的结果中显示。如何循环数组POST请求结果请为我的问题提供建议
我猜您正在尝试以错误的方式解析json。而且您无法在content
中获取变量。因此它们可能变为空,并且您的“文本”小部件正在尝试显示空对象
{
"responseCode": "0000",
"responseMessage": "Success",
"tanggal": "20200131",
"jam": "112301",
"content": [
{
"nomorAccount": "1234567890",
"namaPegawai": "DEVELOPMENT",
"statusAccount": "AKTIF",
"jenisAccount": "TABUNGAN",
"produkAccount": "GOLD",
"mataUang": "IDR",
"saldoEfektif": "+100055033221,84",
"saldoBuku": "+100055058221,84"
}
]
}
您正试图通过像content
一样直接调用来在object['nomorAccount']
变量下获取变量。我建议您创建另一个名为Content
class Content {
String nomorAccount;
String namaPegawai;
String statusAccount;
String jenisAccount;
String produkAccount;
String mataUang;
String saldoEfektif;
String saldoBuku;
Content({
this.nomorAccount,
this.namaPegawai,
this.statusAccount,
this.jenisAccount,
this.produkAccount,
this.mataUang,
this.saldoEfektif,
this.saldoBuku});
factory Content.fromJson(Map<String, dynamic> json) {
return Content (
nomorAccount: json['nomorAccount'],
namaPegawai: json['namaPegawai'],
statusAccount: json['statusAccount'],
jenisAccount: json['jenisAccount'],
produkAccount: json['produkAccount'],
mataUang: json['mataUang'],
saldoEfektif:json['saldoEfektif'],
saldoBuku:json['saldoBuku']
);
}
并且在PostResult
模型中
class PostResult {
String responseCode;
String responseMessage;
String tanggal;
String jam;
Content content;
PostResult(
{this.responseCode,
this.responseMessage,
this.tanggal,
this.jam,
this.content});
factory PostResult.createPostResult(Map<String, dynamic> object) {
return PostResult(
responseCode: object['responseCode'],
responseMessage: object['responseMessage'],
tanggal: object['tanggal'],
jam: object['jam'],
content: Content.fromJson(object['content']),
);
}
yourConnectToApiFunction()
}
编辑:
我没有意识到您的JSON返回一个仅包含一项内容的数组。如果它总是返回一个项目,则可以更改您的API,使其仅作为一个对象而不是数组,并保留飞镖代码。
无论如何,它返回多个对象,您需要像下面那样更改模型:
class PostResult {
String responseCode;
String responseMessage;
String tanggal;
String jam;
List<Content> content;
PostResult(
{this.responseCode,
this.responseMessage,
this.tanggal,
this.jam,
this.content});
factory PostResult.createPostResult(Map<String, dynamic> object) {
return PostResult(
responseCode: object['responseCode'],
responseMessage: object['responseMessage'],
tanggal: object['tanggal'],
jam: object['jam'],
content: (object['content'] as List)
.map((e) => Content.fromJson(e as Map<String, dynamic>))
.toList(),
);
}
yourConnectToApiFunction()
}
然后您可以得到像responseObject.content[0].nomorAccount
这样的项目>
建议
而不是硬编码所有这些json类,我建议您使用Json Serializable包
查看下面的示例