flatter-ListView.builder()在JSON获取后不工作
我试图从类文件中的局部变量加载JSON,并使用PODO类将JSON转换为对象列表,但我不知道为什么不生成列表。我很沮丧。请帮助我哪里做错了 我已经尝试了各种可能的方法来操作代码,即使是相同的代码也可以用它的PODO类处理不同的JSON格式 多谢各位 颤振类源代码:flatter-ListView.builder()在JSON获取后不工作,json,flutter,dart,Json,Flutter,Dart,我试图从类文件中的局部变量加载JSON,并使用PODO类将JSON转换为对象列表,但我不知道为什么不生成列表。我很沮丧。请帮助我哪里做错了 我已经尝试了各种可能的方法来操作代码,即使是相同的代码也可以用它的PODO类处理不同的JSON格式 多谢各位 颤振类源代码: import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class Demo
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class Demo extends StatefulWidget {
@override
_Demo createState() => _Demo();
}
class _Demo extends State<Demo> {
final localJson = '''
[
{
"message": "Some message here 1"
},
{
"message": "Some message here 2"
},
{
"message": "Some message here 3"
}
]
''';
Widget getCommentItem({@required PodoClass item}) {
return Text(item.message);
}
Future<List<PodoClass>> fetchComments() async {
return compute(parseJson, localJson);
}
List<PodoClass> parseJson(String responseBody) {
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<PodoClass>((json) => PodoClass.fromJson(json)).toList();
}
Widget _bodyBuild({@required List<PodoClass> items}) {
return ListView.builder(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20),
itemCount: items.length,
itemBuilder: (BuildContext ctxt, int index) {
return getCommentItem(item: items[index]);
});
}
Widget body() {
return FutureBuilder<List<PodoClass>>(
future: fetchComments(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? _bodyBuild(items: snapshot.data)
: Center(child: Text('Loading..'));
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"Comments",
),
Text("Battle ID", style: TextStyle(fontSize: 12))
])),
body: body());
}
}
// podo class
class PodoClass {
String message;
PodoClass({this.message});
PodoClass.fromJson(Map<String, dynamic> json) {
message = json['message'];
}
}
导入'dart:convert';
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
类Demo扩展StatefulWidget{
@凌驾
_演示createState()=>_Demo();
}
类_Demo扩展了状态{
最终localJson=''
[
{
“消息”:“此处有消息1”
},
{
“消息”:“此处有消息2”
},
{
“消息”:“此处有消息3”
}
]
''';
小部件getCommentItem({@required PodoClass item}){
返回文本(item.message);
}
Future fetchComments()异步{
返回compute(parseJson、localJson);
}
List parseJson(字符串响应库){
final parsed=json.decode(responseBody.cast();
返回parsed.map((json)=>PodoClass.fromJson(json)).toList();
}
小部件_bodyBuild({@required List items}){
返回ListView.builder(
物理:弹跳CrollPhysics(),
填充:边缘组。对称(垂直:20,水平:20),
itemCount:items.length,
itemBuilder:(BuildContext ctxt,int index){
返回getCommentItem(项:项[索引]);
});
}
小部件主体(){
回归未来建设者(
future:fetchComments(),
生成器:(上下文,快照){
if(snapshot.hasError)打印(snapshot.error);
返回snapshot.hasData
?_车身构造(项目:快照.数据)
:居中(子项:文本('Loading..);
},
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:错误,
标题:专栏(
crossAxisAlignment:crossAxisAlignment.start,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“评论”,
),
文本(“战斗ID”,样式:TextStyle(字体大小:12))
])),
body:body());
}
}
//波多级
类PodoClass{
字符串消息;
PodoClass({this.message});
fromJson(映射json){
message=json['message'];
}
}
必须将parseJson
函数移到类外
它应该是顶级功能
回调参数必须是顶级函数,而不是闭包或
类的实例或静态方法
在这种情况下,计算不起作用,只需调用函数即可。 我已经包括了一个可能有助于您进行测试的延迟
导入'dart:convert';
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
类Demo扩展StatefulWidget{
@凌驾
_演示createState()=>_Demo();
}
类_Demo扩展了状态{
最终localJson=''
[
{
“消息”:“此处有消息1”
},
{
“消息”:“此处有消息2”
},
{
“消息”:“此处有消息3”
}
]
''';
小部件getCommentItem({@required PodoClass item}){
返回文本(item.message);
}
Future fetchComments()异步{
等待未来。延迟(持续时间(秒:5));
返回parseJson(localJson);
}
List parseJson(字符串响应库){
final parsed=json.decode(responseBody.cast();
返回parsed.map((json)=>PodoClass.fromJson(json)).toList();
}
小部件_bodyBuild({@required List items}){
返回ListView.builder(
物理:弹跳CrollPhysics(),
填充:边缘组。对称(垂直:20,水平:20),
itemCount:items.length,
itemBuilder:(BuildContext ctxt,int index){
返回getCommentItem(项:项[索引]);
});
}
小部件主体(){
回归未来建设者(
future:fetchComments(),
生成器:(上下文,快照){
if(snapshot.hasError)打印(snapshot.error);
返回snapshot.hasData
?_车身构造(项目:快照.数据)
:居中(子项:文本('Loading..);
},
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:错误,
标题:专栏(
crossAxisAlignment:crossAxisAlignment.start,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“评论”,
),
文本(“战斗ID”,样式:TextStyle(字体大小:12))
])),
body:body());
}
}
//波多级
类PodoClass{
字符串消息;
PodoClass({this.message});
fromJson(映射json){
message=json['message'];
}
}
我看到您正在使用一种名为compute()
的方法。这个方法在做什么?解决问题的最佳方法是在每个方法的入口和出口打印数组的值。这样,您就可以隔离用于构建列表的步骤,并可能找到问题所在。@andericasim compute()函数在后台隔离运行昂贵的函数并返回结果。哦,太好了。非常感谢。谢谢你的解释。感谢您的努力,但这不是计算JSON的正确方法,想想看,如果JSON是如此复杂和庞大,那么5秒将是如此之少。正如Eugene所回答的那样,解决方案非常好。
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class Demo extends StatefulWidget {
@override
_Demo createState() => _Demo();
}
class _Demo extends State<Demo> {
final localJson = '''
[
{
"message": "Some message here 1"
},
{
"message": "Some message here 2"
},
{
"message": "Some message here 3"
}
]
''';
Widget getCommentItem({@required PodoClass item}) {
return Text(item.message);
}
Future<List<PodoClass>> fetchComments() async {
await Future.delayed(Duration(seconds: 5));
return parseJson(localJson);
}
List<PodoClass> parseJson(String responseBody) {
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<PodoClass>((json) => PodoClass.fromJson(json)).toList();
}
Widget _bodyBuild({@required List<PodoClass> items}) {
return ListView.builder(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20),
itemCount: items.length,
itemBuilder: (BuildContext ctxt, int index) {
return getCommentItem(item: items[index]);
});
}
Widget body() {
return FutureBuilder<List<PodoClass>>(
future: fetchComments(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? _bodyBuild(items: snapshot.data)
: Center(child: Text('Loading..'));
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"Comments",
),
Text("Battle ID", style: TextStyle(fontSize: 12))
])),
body: body());
}
}
// podo class
class PodoClass {
String message;
PodoClass({this.message});
PodoClass.fromJson(Map<String, dynamic> json) {
message = json['message'];
}
}