flatter-ListView.builder()在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

我试图从类文件中的局部变量加载JSON,并使用PODO类将JSON转换为对象列表,但我不知道为什么不生成列表。我很沮丧。请帮助我哪里做错了

我已经尝试了各种可能的方法来操作代码,即使是相同的代码也可以用它的PODO类处理不同的JSON格式

多谢各位

颤振类源代码:

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'];
  }
}