【问题标题】:How to display images, received from an API response in flutter?如何显示从 API 响应中接收到的图像?
【发布时间】:2019-04-04 17:04:24
【问题描述】:

我正在使用 http Dart package 向 MapQuest 静态地图 API 发送 GET 请求以获取图像。但是,对这个请求的响应直接返回一个图像,而不是一个Uri,或者我做错了什么。

你能帮我显示收到的图像吗?

这里是请求代码:

 final http.Response response = await http.get(
    'https://www.mapquestapi.com/geocoding/v1/address?key=[MYAPIKEY]&inFormat=kvp&outFormat=json&location=${address}&thumbMaps=false&maxResults=1');

final decodedResponse = json.decode(response.body);
setState(() {
  _coords = decodedResponse['results'][0]['locations'][0]['latLng'];
});
 final http.Response staticMapResponse = await http.get(
        'https://www.mapquestapi.com/staticmap/v5/map?key=[MYAPIKEY]&center=${coords['lat']},${coords['lng']}&zoom=13&type=hyb&locations=${coords['lat']},${coords['lng']}&size=500,300@2x');

坐标是从 MapQuest 的地理编码 API 接收的,这是一个 async 请求。

【问题讨论】:

标签: api flutter mapquest


【解决方案1】:

正如Günter Zöchbauer 所建议的那样,我将请求网址直接包含在我的 Image.network() 小部件中并且它起作用了。

代码如下:

void getStaticMapCoordinates(String address) async {
    if (address.isEmpty) {
      return;
    }

    final http.Response response = await http.get(
        'https://www.mapquestapi.com/geocoding/v1/address?key=[APIKEY]&inFormat=kvp&outFormat=json&location=${address}&thumbMaps=false&maxResults=1');

    final decodedResponse = json.decode(response.body);
    setState(() {
      _coords = decodedResponse['results'][0]['locations'][0]['latLng'];
    });
  }

  Widget _buildStaticMapImage() {

    if(_coords == null) {
      return Image.asset('assets/product.jpg');
    }
    return FadeInImage(
      image: NetworkImage(
          'https://www.mapquestapi.com/staticmap/v5/map?key=[APIKEY]&center=${_coords['lat']},${_coords['lng']}&zoom=13&type=hyb&locations=${_coords['lat']},${_coords['lng']}&size=500,300@2x'),
      placeholder: AssetImage('assets/product.jpg'),
    );
  }

getStaticMapCoordinates 函数在用户每次更改地址字段时执行,并且由于setState,图像小部件会重新呈现。

【讨论】:

  • 请求中有什么header?
【解决方案2】:

我使用 Image 类从响应体中以字节流形式创建内存中的图像对象。

var _profileImage = Image.memory(response.bodyBytes).image;

现在你可以直接在你的组件中加载这个图片了。

【讨论】:

    【解决方案3】:

    如果图片是来自您的 URL 的休息:

    //...
        child: new ClipRRect(
             borderRadius: new BorderRadius.circular(30.0),
             child: Image.network('https://www.mapquestapi.com/staticmap/v5/map?key=[MYAPIKEY]&center=${coords['lat']},${coords['lng']}&zoom=13&type=hyb&locations=${coords['lat']},${coords['lng']}&size=500,300@2x', 
                                  fit: BoxFit.cover, 
                                  height: 60.0, width: 60.0))    
        //...
    

    如果需要解析:

      final response = await http
          .get('https://www.mapquestapi.com/staticmap/v5/map?key=[MYAPIKEY]&center=${coords['lat']},${coords['lng']}&zoom=13&type=hyb&locations=${coords['lat']},${coords['lng']}&size=500,300@2x');
    
      if (response.statusCode == 200) {
        // If the call to the server was successful, parse the JSON
        return json.decode(response.body)["imageURL"]; //  <------- DO THE PARSING HERE AND THEN PASS THE URL TO THE ABOVE EXAMPLE
      } else {
        // If that call was not successful, throw an error.
        throw Exception('Failed to load post');
      }
    

    【讨论】:

    【解决方案4】:

    您可以将标题添加到 NetworkImage 小部件,例如: NetworkImage("你的端点 URL", headers: {header:value}) 以下链接有更多信息。
    https://api.flutter.dev/flutter/widgets/Image/Image.network.html

    【讨论】:

      【解决方案5】:

      有时从带有复杂标题的 URL 获取图像很麻烦。所以那个时候,我们可以直接在NetworkImage小部件中使用header map,它就像一个魅力-

              .
              .
          child: CircleAvatar(
                  backgroundImage:
                  NetworkImage("www.mypropic.com",headers:getTokenHeaders());)
              .
              . 
      
          static Map<String, String> getTokenHeaders() {
          Map<String, String> headers = new Map();
          headers['Authorization'] = _bearerToken!;
          headers['content-type'] = 'application/json';
          return headers;
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多