【问题标题】:How to solve this "The getter 'length' was called on null"如何解决此“在 null 上调用了 getter 'length'”
【发布时间】:2019-11-05 00:58:33
【问题描述】:

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

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

如何解决这个问题?
提前致谢。

【问题讨论】:

  • 您可以访问错误堆栈跟踪吗?请在这里发帖。
  • 哪个.length 导致了这个问题?附带说明一下,如果您只是将 json.decode 的结果分配给它,则不必将 values 初始化为新列表。
  • 这取决于.length 是什么导致了这个问题?

标签: json http flutter


【解决方案1】:

只需对列表 List&lt;Post&gt; _postList = [] 执行此操作,它的所有内容都是 Dart 中的对象,因此当您执行此操作时 List&lt;Post&gt; _postList = new List&lt;Post&gt;(); 您的变量 _postList 等于 null 因为已声明但未初始化,因此默认情况下它为 null 并且在初始化之前,您将无法使用列表的任何属性。

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

所以你没有这个问题。

【讨论】:

  • 我确实喜欢你提到的但不起作用。我认为问题在于长度本身,但我对解决方案感到困惑。
【解决方案2】:

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

[{"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"}]

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

【讨论】:

  • 感谢材料。问题出在 get.php 文件中,所以我需要移动这一行
    print(json_encode(array_reverse($json_array), JSON_UNESCAPED_UNICODE));在循环的右大括号之后。
  • 现在我有另一个问题是记录的重复,我会试着弄清楚。
  • 是的,我以前也这样做过。现在如何解决重复的问题?。
  • @ASB 不想粗鲁,但您接受了我的回答,而不是赞成。这是我根据您提出的代码的link。我最近一次测试它没有重复错误。
  • 亲爱的,你是在第 46 行手动完成的。顺便说一下,我需要从服务器上的 php 文件本身读取,而不是初始化整个 json 数据对象。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2021-08-11
    • 2021-02-23
    • 2021-12-10
    • 2018-12-03
    • 2020-06-15
    • 2021-05-25
    • 2023-03-08
    相关资源
    最近更新 更多