首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter:无法将http响应转换为podo对象

Flutter:无法将http响应转换为podo对象
EN

Stack Overflow用户
提问于 2020-05-03 13:10:50
回答 2查看 112关注 0票数 0

XKCD.dart

代码语言:javascript
复制
class XKCD {
  final String id;
  final String imageURL;
  final String safeTitle;

  XKCD({this.id, this.imageURL, this.safeTitle});

  factory XKCD.fromJson(Map<String, dynamic> json){
    return XKCD(
    id: json['num'],
    imageURL:json['img'],
    safeTitle:json['safe_title'],
    );
  }
}
代码语言:javascript
复制
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:fluttermvpillustrativeapp/data/xkcd_data.dart';

class ProdXKCDRepo {
  String baseURL = "http://xkcd.com/";

  Future<XKCD> fetchComicPost() async {
    http.Response response = await http.get(baseURL + "info.0.json");
    final responseBody = json.decode(response.body);
    final statusCode = response.statusCode;

    if (response.statusCode == 200) {
      print (XKCD.fromJson(json.decode(response.body)); // No value gets printed
      return XKCD.fromJson(json.decode(response.body));
    }

  }
}
代码语言:javascript
复制
class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Future<XKCD> comicPost;

  @override
  void initState() {
    super.initState();
    comicPost = ProdXKCDRepo().fetchComicPost();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("XKCD comic"),
        actions: <Widget>[
          IconButton(
            icon: new Icon(Icons.file_download),
            tooltip: 'Download',
            onPressed: () {},
          ),
          IconButton(
            icon: new Icon(Icons.share),
            tooltip: 'Share',
            onPressed: () {},
          ),
        ],
      ),
      body: _comicBody(),
    );
  }

  Widget _comicBody() {
    return Center(
      child: FutureBuilder<XKCD>(
        future: comicPost,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            Column(
              children: <Widget>[
                Expanded(
                  child: Container(
                    child: PhotoView(
                      imageProvider: NetworkImage(snapshot.data.imageURL),
                    ),
                  ),
                  flex: 1,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    IconButton(icon: Icon(Icons.fast_rewind), onPressed: null),
                    IconButton(icon: Icon(Icons.chevron_left), onPressed: null),
                    IconButton(
                        icon: Icon(Icons.center_focus_strong), onPressed: null),
                    IconButton(
                        icon: Icon(Icons.chevron_right), onPressed: null),
                    IconButton(icon: Icon(Icons.fast_forward), onPressed: null),
                  ],
                )
              ],
            );
          }
          // By default, show a loading spinner.
          return CircularProgressIndicator();
        },
      ),
    );
  }
}

当我在FutureBuilder中使用它时,会得到错误imageURL is null,并且微调器会无限地加载。

代码语言:javascript
复制
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building FutureBuilder<XKCD>(dirty, state: _FutureBuilderState<XKCD>#b4c12):
The getter 'imageURL' was called on null.
Receiver: null
Tried calling: imageURL

我不知道我错在哪里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-03 13:54:52

您忘记在以下位置添加return关键字。

代码语言:javascript
复制
if (snapshot.hasData) { return Column( children: <Widget>[ 

正因为如此,你没有得到更新的UI。

票数 1
EN

Stack Overflow用户

发布于 2020-05-03 13:57:30

您的错误可以通过在将来的构建器中的列之前添加return语句来修复。

请看下面的代码:

代码语言:javascript
复制
if (snapshot.hasData) {
           return Column(
            children: <Widget>[
              Expanded(
                child: Container(
                  child: Image.network('${snapshot.data.imageURL}'),
                ),
                flex: 1,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  IconButton(icon: Icon(Icons.fast_rewind), onPressed: null),
                  IconButton(icon: Icon(Icons.chevron_left), onPressed: null),
                  IconButton(
                      icon: Icon(Icons.center_focus_strong), onPressed: null),
                  IconButton(icon: Icon(Icons.chevron_right), onPressed: null),
                  IconButton(icon: Icon(Icons.fast_forward), onPressed: null),
                ],
              )
            ],
          );
        }

输出:

希望能有所帮助。

完整代码:

代码语言:javascript
复制
Widget _comicBody() {
  return Center(
    child: FutureBuilder<XKCD>(
      future: ProdXKCDRepo().fetchComicPost(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Column(
            children: <Widget>[
              Expanded(
                child: Container(
                  child: Image.network('${snapshot.data.imageURL}'),
                ),
                flex: 1,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  IconButton(icon: Icon(Icons.fast_rewind), onPressed: null),
                  IconButton(icon: Icon(Icons.chevron_left), onPressed: null),
                  IconButton(
                      icon: Icon(Icons.center_focus_strong), onPressed: null),
                  IconButton(icon: Icon(Icons.chevron_right), onPressed: null),
                  IconButton(icon: Icon(Icons.fast_forward), onPressed: null),
                ],
              )
            ],
          );
        } else if (snapshot.hasError) {
          return Center(
            child: Text('${snapshot.error}'),
          );
        }
        // By default, show a loading spinner.
        return CircularProgressIndicator();
      },
    ),
  );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61569903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档