如何解决此问题:“将getter'length'调用为null”

时间:2019-06-22 13:32:20

标签: json http flutter

我有一个php文件托管在我的大学服务器上,当我在服务器上运行此文件时,它运行得很好。我可以在运行链接http://www.alkadhum-col.edu.iq/Teachers%20Activities/get.php中的php文件后获取json数据,但是当我尝试在应用程序屏幕上抖动时得到“ getter'length'被调用时,当我无法获取它们时,空值”。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() {
runApp(Workshops());
}

class Workshops extends StatelessWidget {
  @override
  Widget build(BuildContext mycontext) {
    return MaterialApp(
      home:Scaffold(
        appBar: AppBar(
          backgroundColor: Color.fromRGBO( 52, 73, 94, 1.0),
        automaticallyImplyLeading: false, // Don't show the leading button
        title: new Text("PHP with Flutter"),
        ),

        body: PostScreen(),
        )
    );
  }
}    

class PostScreen extends StatefulWidget {
  @override
  _PostScreenState createState() => _PostScreenState();
}

class _PostScreenState extends State<PostScreen> {
  List<Post> _postList = new List<Post>();

  Future<List<Post>> fetchPost() async {
    final response =
        await http.get('http://www.alkadhum-col.edu.iq/Teachers%20Activities/get.php');

    if (response.statusCode == 200) {
      // If the call to the server was successful, parse the JSON
      List<dynamic> values = new List<dynamic>();
      values = json.decode(response.body);
      if (values.length > 0) {
        for (int i = 0; i < values.length; i++) {
          if (values[i] != null) {
            Map<String, dynamic> map = values[i];
            _postList.add(Post.fromJson(map));
          }
        }
      }
      return _postList;
    } else {
      // If that call was not successful, throw an error.
      throw Exception('Failed to load post');
    }
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Post>>(
      future: fetchPost(),
      builder: (_, AsyncSnapshot<List<Post>> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        }

        return ListView.builder(
          itemCount: snapshot.data.length,
          itemBuilder: (_, index) {
            //dynamic post = snapshot.data[index];
            return (Container(
              margin: EdgeInsets.symmetric(vertical: 2.0, horizontal: 8.0),
              child: new Card(
                elevation: 10.0,
                child: new Container(
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      new Text(snapshot.data[index].name, style: TextStyle(fontSize: 18.0),),
                      new Text(snapshot.data[index].msg, style: TextStyle(fontSize: 18.0),),
                      new Text(snapshot.data[index].day, style: TextStyle(fontSize: 18.0),),
                      new Text(snapshot.data[index].date, style: TextStyle(fontSize: 18.0),),
                    ],
                  ),
                ),
              ),
            ));
          },
        );
      },
    );
  }

  @override
  void initState() {
    super.initState();
    fetchPost();
  }
}

class Post {
  String name;
  String msg;
  String day;
  String date;

  Post({this.name, this.msg, this.day, this.date});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      name: json['name'],
      msg: json['msg'],
      day: json['day'],
      date:json['date']
    );
  }
}

如何解决此问题?。
预先感谢。

3 个答案:

答案 0 :(得分:1)

我查看了您的链接并尝试运行代码,我认为问题出在从您的链接返回的数据中。

[{"name":"م.م علي ستار باراني","msg":"امتحان مادة قواعد البيانات اول جابترين ","day":"السبت","date":"2019-06-20"}][{"name":"م. امجد عباس التميمي","msg":"امتحان مادة هندسة البرامجيات اول فصلين","day":"الاحد","date":"2019-06-21"},{"name":"م.م علي ستار باراني","msg":"امتحان مادة قواعد البيانات اول جابترين ","day":"السبت","date":"2019-06-20"}]

在第一个对象之后,您有一个闭合的方括号,并且没有逗号将其与旁边的开放方括号分开。在链接正文上调用json.decode()会引发以下错误

FormatException (FormatException: Unexpected character (at character 115)
...,"day":"السبت","date":"2019-06-20"}][{"name":"م. امجد عباس التميمي","msg...
                                       ^
)

修复该问题后,对我来说运行正常。我通过手动获取链接的正文并删除有问题的字符进行了测试,剩下下面的json。

[{"name":"م.م علي ستار باراني","msg":"امتحان مادة قواعد البيانات اول جابترين ","day":"السبت","date":"2019-06-20"},{"name":"م. امجد عباس التميمي","msg":"امتحان مادة هندسة البرامجيات اول فصلين","day":"الاحد","date":"2019-06-21"},{"name":"م.م علي ستار باراني","msg":"امتحان مادة قواعد البيانات اول جابترين ","day":"السبت","date":"2019-06-20"}]

正在运行该应用程序现在显示以下内容:

Screenshot of app

答案 1 :(得分:0)

只需对列表List<Post> _postList = []进行此操作,它所发生的一切就是Dart中的对象,因此,当您执行此List<Post> _postList = new List<Post>();时,变量_postList等于null,因为已经声明但未初始化默认为null,并且在列表初始化之前您将无法使用该列表的任何属性。

在简历中只需像这样初始化您的列表:一个空列表  List<Post> _postList = [];

所以您没有那个问题。

答案 2 :(得分:0)

确保始终像这样检查itemCount中的空值

ListView.builder(
  itemCount: snapshot.data.length == null ? 0 :snapshot.data.length,
  itemBuilder: (_, index){}
),

如果您的列表为空,则itemCount将返回0。