【问题标题】:Listview builder is constantly giving me nullListview builder不断给我null
【发布时间】:2021-11-01 12:40:35
【问题描述】:

我有这个:

class HonPage extends StatefulWidget {
  final Status? status;

  HonPage({Key? key, this.status}) : super(key: key);

  @override
  _HonPageState createState() {
    return _HonPageState();
  }
}

class _HonPageState extends State<HonPage> {

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


  Widget build(BuildContext context) {
    return new ListView.builder(
        itemCount: 10,
        itemBuilder: (context, index) {
          return new ListTile(
            title: new Text("${widget.status.title ?? ""}"),
          );
        }
    );
  }
}

我的结果:

NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL

无论我做什么,我似乎都无法从JSON 获取项目。

JSON 和 API URL 适用于所有其他屏幕,因此不会出错。我在这里做错了什么?只是我新建了一个tab,想显示信息。

编辑: 在 Status.dart 中,我有这个:

Status(Map<String, dynamic> json) : super(json) {
    status = json["status"];
    title = json["title"];
    ....
}

JSON:

[{"title": "NAME ME", "status": "publish"}]

【问题讨论】:

  • 看来我们在这里遗漏了很多上下文。 JSON?获取项目?这些都不在你的代码中......
  • 您向我们展示的内容与您遇到的问题无关。 NULL 值来自 ${widget.status.title},所以向我们展示你是如何获取数据的,status.title 来自哪里
  • 查看编辑后的帖子。
  • 您还没有发布指示“widget.status.title”应该为空的行。
  • 现在可以了吗?

标签: json flutter api rest dart


【解决方案1】:

在构建 ListView 以显示 API 调用的结果时,您应该使用 FutureBuilder

Widget _buildBody(BuildContext context) {
  return FutureBuilder<List<Status>>(
    future: fetchStatus(), // async API call that returns List<Status>
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (snapshot.hasError) {
        return const Text("some error");
      }
      if (snapshot.connectionState != ConnectionState.done) {
        return const Center(child: CircularProgressIndicator());
      }
      if (!snapshot.hasData) {
        return const Text("some error");
      }
      final list = snapshot.data as List<Status>;
      return ListView.builder(
        itemCount: list.length,
        itemBuilder: (BuildContext context, int index) {
          return ListTile(
            title: Text('${list[index].title ?? ""}'),
          );
        },
      );
    },
  );
}

更新:

您必须创建以下类:

class Status {
  final String title;
  final String status;

  const Status({
    this.title = '',
    this.status = '',
  });

  factory Status.fromJson(Map<String, dynamic> json) => Status(
      title: json['title'] as String? ?? '',
      status: json['status'] as String? ?? '',
    );

  Map<String, dynamic> toJson() => <String, dynamic>{
      'title': title,
      'status': status,
    };
}

您必须编写方法fetchStatus 来调用API 并返回List&lt;Status&gt;

更新 2

return ListTile(
  title: Text('${places[index].title ?? ""}'),
  onTap: () {
    Navigator.pushNamed(
      context,
      '/detail_page',
      arguments: places[index],
    );
  },
);

【讨论】:

  • 嗯,我不明白。它给了我关于快照和错误的错误:“状态”不是一种类型。最终列表 = snapshot.data as List; ^^^^^^ lib/src/views/sfa.dart:44:15: 错误:没有为类定义方法“fetchStatus”
  • 我已经更新了上面的答案以包含 Status 数据类的示例,但您必须自己提供 fetchStatus 方法。它应该返回Future&lt;List&lt;Status&gt;&gt;
  • Roslan,我的 API 的 URL 应该放在哪里?
  • 查看我对此的回答:stackoverflow.com/questions/69832046/…。见课程APIService
  • 清除。去帖子的详细页面怎么样? stackoverflow.com/questions/69800298/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2022-01-06
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多