【问题标题】:API data display - flutter card widgetAPI数据展示——flutter card widget
【发布时间】:2021-01-04 19:55:29
【问题描述】:

获取 API 连接成功。但我不知道如何映射数据..如何连接快照.data, 我想在 Stack 小部件中显示数据。

https://flutter.dev/docs/cookbook/networking/fetch-data

我从与此来源的关联中了解到这一点

Future<News> fetchNews() async {
  final response =
  await http.get('#url');
  print(response.body);

  if (response.statusCode == 200) {
    return News.fromJson(jsonDecode(response.body));
  } else {
    throw Exception('Failed to load news');
  }
}

class News {
  final String title;
  final String description;
  final String image;

  News({this.title, this.description, this.image});

  factory News.fromJson(Map<String, dynamic> json) {
    return News(
      title: json['title'],
      description: json['description'],
      image: json['image'],
    );
  }
}

  Widget _buildPage(BuildContext context, int direction) {
    Size size = MediaQuery.of(context).size;
    return SafeArea(
      child: FutureBuilder<News>(
        future: futureNews,
          builder: (context, snapshot) {
          if (snapshot.hasData) {
            return newsCard(snapshot.data);
          } else if (snapshot.hasError) {
            return Text("${snapshot.error}");
          }
          return CircularProgressIndicator();
      },
    ),
    );
  }

  Widget newsCard(size){
    return Stack(
      children: <Widget>[
        Container(
          child: Image.network(
              image,
              fit: BoxFit.cover
          ),
          height: size.height/2.0,
        ),
        ),
      ],
    );
  }

【问题讨论】:

  • 你能展示你的未来吗?你在json中获取数据吗?你是在解码数据之后吗?从您的代码看来,您的 News 对象似乎被用于获取高度?那是对的吗?声明的图像变量在哪里?
  • 好的.. 感谢您的回复。我更新了问题。

标签: api flutter dart


【解决方案1】:

您的代码有点乱,没有多大意义。很明显,数据没有显示出来,因为您将News 对象传递给newsCard 函数,但参数似乎期待Size。我也不知道你从哪里得到 image 属性,因为它似乎没有在代码中的任何地方声明。

对您的代码进行一些更改,返回您的小部件的最小工作函数如下所示:


Widget _buildPage(BuildContext context, int direction) {
    Size size = MediaQuery.of(context).size;
    return SafeArea(
      child: FutureBuilder<News>(
        future: futureNews,
          builder: (context, snapshot) {
          if (snapshot.hasData) {
            return newsCard(snapshot.data, size);
          } else if (snapshot.hasError) {
            return Text("${snapshot.error}");
          }
          return CircularProgressIndicator();
      },
    ),
    );
  }

  Widget newsCard(News news, Size size){
    return Stack(
      children: <Widget>[
        Container(
          child: Image.network(
              news.image,
              fit: BoxFit.cover
          ),
          height: size.height/2.0,
        ),
        ),
      ],
    );
  }


更新

如果您收到下面提到的错误,很可能您对 get 请求的响应是 News 的列表,而不仅仅是一个 News 对象,因此您必须更改此:

return News.fromJson(jsonDecode(response.body));

到这里:

return jsonDecode(response.body).map<News>((object) => News.fromJson(object)).toList();

fetchNews() 的返回类型应该是Future&lt;List&lt;News&gt;&gt; 而不是Future&lt;News&gt;

【讨论】:

  • 我有一个错误。 “错误:List 不是 Map 类型的子类型”
  • 你的回复是列表吗?
  • 我添加了这些更改..但我在 FutureBuilder 中出现了另一个错误..“future:futureNews,”部分有错误并且没有提示任何错误代码。
  • lib/widgets/news.dart:59:17:错误:参数类型“Future>”不能分配给参数类型“Future”。 - “未来”来自“飞镖:异步”。 - “列表”来自“飞镖:核心”。 - “新闻”来自“package:openmic_mobile/widgets/news.dart”(“lib/widgets/news.dart”)。未来:未来新闻,
  • 那是因为您已将 FutureBuilder 标记为期望 Future。您还需要将预期类型添加到 List 到 FutureBuilder。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 2020-02-11
  • 2021-10-08
  • 1970-01-01
  • 2021-10-03
  • 2022-11-19
  • 2018-12-30
  • 2020-12-17
相关资源
最近更新 更多