Flutter使用NetworkImage实现图像显示效果

使用 NetworkImage 显示图像

在 GitHub 中,每个成员都有其头像的 URL。您的下一个改进是将该头像添加到Member课程中并在应用程序中显示这些头像。

更新Member以添加avatarUrl属性。它现在应该是这样的:

class Member {
  Member(this.login, this.avatarUrl);
  final String login;
  final String avatarUrl;
}

由于avatarUrl现在是必需参数,因此 Flutter 在_loadData. 将setState回调替换为_loadData以下更新版本:

setState(() {
  final dataList = json.decode(response.body) as List;
  for (final item in dataList) {
    final login = item['login'] as String? ?? '';
    final url = item['avatar_url'] as String? ?? '';
    final member = Member(login, url);
    _members.add(member);
  }
});

上面的代码使用avatar_url键在从 JSON 解析的地图中查找 URL 值,然后将其设置为url字符串,然后将其传递给Member

现在您可以访问头像的 URL,将其添加到您的ListTile. 替换_buildRow为以下内容:

Widget _buildRow( int i) {
   return Padding(
    padding: const EdgeInsets.all( 16.0 ),
    child: ListTile(
      title: Text( ' ${_members[i].login} ' , style: _biggerFont),
      Leadership: CircleAvatar(
        backgroundColor : Colors.green,
        backgroundImage: NetworkImage(_members[i].avatarUrl),
      ),
    ),
  );
}

这会CircleAvatar在您的ListTile. 当您等待图像下载时,背景CircleAvatar将是绿色的。

执行热重启而不是热重新加载。您将在每一行中看到您的会员头像:

整理代码

你的大部分代码现在都在main.dart 中。为了使代码更简洁一些,您将类重构为它们自己的文件。

在lib文件夹中创建名为member.dart和ghflutter.dart的文件。移动到member.dart两者并进入ghflutter.dart。Member``_GHFlutterState``GHFlutter

你不需要任何import语句member.dart,但在进口ghflutter.dart应该是:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'member.dart';
import 'strings.dart' as strings;

您还需要更新main.dart 中的导入。用以下内容替换整个文件:

// ignore_for_file: prefer_const_constructors, unnecessary_new
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'jg_flutter_page.dart';
import 'strings.dart' as strings;
​
void main() => runApp(new MyApp());
​
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: strings.appTitle,
      theme: ThemeData(primaryColor: Colors.green.shade800),
      home: JGFlutter(),
    );
  }
}

jg_flutter_page.dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
​
import 'member.dart';
import 'strings.dart' as strings;
​
class JGFlutter extends StatefulWidget {
  const JGFlutter({Key? key}) : super(key: key);
​
  @override
  _JGFlutterState createState() => _JGFlutterState();
}
​
class _JGFlutterState extends State<JGFlutter> {
  final _members = <Member>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _loadData();
  }
​
  Future<void> _loadData() async {
    const dataUrl = 'https://api.github.com/orgs/raywenderlich/members';
    final response = await http.get(Uri.parse(dataUrl));
    setState(() {
      final dataList = json.decode(response.body) as List;
      for (final item in dataList) {
        final login = item['login'] as String? ?? '';
        final url = item['avatar_url'] as String? ?? '';
        final member = Member(login, url);
        _members.add(member);
      }
    });
  }
​
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(strings.appTitle),
      ),
      body: ListView.separated(
          itemCount: _members.length,
          itemBuilder: (BuildContext context, int position) {
            return _buildRow(position);
          },
          separatorBuilder: (context, index) {
            return const Divider();
          }),
    );
  }
​
  Widget _buildRow(int i) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: ListTile(
        title: Text('${_members[i].login}', style: _biggerFont),
        leading: CircleAvatar(
          backgroundColor: Colors.green,
          backgroundImage: NetworkImage(_members[i].avatarUrl),
        ),
      ),
    );
  }
}

member

class Member {
  Member(this.login, this.avatarUrl);
  final String login;
  final String avatarUrl;
}

strings.dart

const appTitle = 'JGFlutter';

以上就是Flutter使用NetworkImage实现图像显示效果的详细内容,更多关于Flutter NetworkImage图像显示的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android框架Volley之利用Imageloader和NetWorkImageView加载图片的方法

    首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: <uses-permission android:name="android.permission.INTERNET"/> 下面是我们的首页布局: 在这个布局当中我们将Volley框架的所有功能都做成了一个按钮,按下按钮之后就会在"显示结果"下面显示结果,显示结果下

  • Android可循环显示图像的Android Gallery组件用法实例

    本文实例分析了Android可循环显示图像的Android Gallery组件用法.分享给大家供大家参考,具体如下: Gallery组件主要用于横向显示图像列表,不过按常规做法.Gallery组件只能有限地显示指定的图像.也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了.这虽然在大多数时候没有什么关系,但在某些情况下,我们希望图像显示到最后一张时再重第1张开始显示,也就是循环显示.要实现这种风格的Gallery组件,就需要对Gall

  • 详谈Android从文件读取图像显示的效率问题

    因为从文件读取图像到Bitmap是一件比较费时的事情,所以研究了一下几种可行的办法,并做了对比. 首先解释一下为什么耗时,这是因为,在从jpg或者png文件中读取Bitmap时,一来需要对外存进行操作并且图像文件一般都比较大,二来在创建Bitmap时,基本都需要对原始图像做操作,例如:降采样.剪切.旋转等等.所以如何高效的读取图片并呈现出来,是一个很值得研究的问题. 根据我的想法,大致想出了3种方案: 1.在当前的UI线程直接读取并操作图像,然后呈现. 2.新开一个子线程读取并操作图像,然后利用

  • Android编程开发实现TextView显示表情图像和文字的方法

    本文实例讲述了Android编程开发实现TextView显示表情图像和文字的方法.分享给大家供大家参考,具体如下: 从这个案例中我们可以学到当我们美化图片美化界面的时候可以在某一区域输入图片和文字混搭信息,第三张图片按比例缩小,第四张图像有超链接 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

  • Flutter使用NetworkImage实现图像显示效果

    使用 NetworkImage 显示图像 在 GitHub 中,每个成员都有其头像的 URL.您的下一个改进是将该头像添加到Member课程中并在应用程序中显示这些头像. 更新Member以添加avatarUrl属性.它现在应该是这样的: class Member { Member(this.login, this.avatarUrl); final String login; final String avatarUrl; } 由于avatarUrl现在是必需参数,因此 Flutter 在_l

  • C语言实现二值图像模拟灰值图像显示效果

    本文实例为大家分享了C语言实现二值图像模拟灰值图像显示效果的具体代码,供大家参考,具体内容如下 图案法 图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图象的灰度感.黑白点的位置选择称为图案化. 下面介绍的一种设计标准图案的算法,是由Limb在1969年提出的. 先以一个2×2的矩阵开始: 通过递归关系有: 其中Mn和Un均为2n×2n的方阵,Un的所有元素都是1. 根据这个算法M2如下,为16级灰度的标准图案: M3(8×8阵)比较特殊,称为Bayer抖

  • OpenCV-Python直方图均衡化实现图像去雾

    直方图均衡化 直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像.这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(HSV)的视觉均衡. 一般来说,直方图均衡化可以达到增强图像显示效果的目的.最常用的比如去雾.下面,我们来分别实现灰度图像去雾以及彩色图像去雾. 实现灰度图像去雾 在OpenCV中,它提供了函数cv2.equalizeHist()来实现直方图均衡化,该函数的完整定义如下: def equalizeHist(src, d

  • OpenCV中图像通道操作的深入讲解

    目录 1.基本介绍 2.通道拆分 2.1通过索引拆分 2.2通过函数拆分 3.通道合并 总结 1.基本介绍 在OpenCV中,图像通道是按照 B 通道→G 通道→R 通道的顺序存储的.在图像处理过程中,可以根据需要对通道进行拆分和合并. 2.通道拆分 对于RGB图像,可以索引的方式或者函数的方式分别拆分出其RGB通道. b = img[ : , : , 0 ] g = img[ : , : , 1 ] r = img[ : , : , 2 ] 2.1通过索引拆分 import cv2 lena=

  • Unity OnGUI实时显示游戏FPS

    FPS是什么? FPS (每秒传输帧数(Frames Per Second))[摘自百度百科] FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数.FPS是测量用于保存.显示动态视频的信息数量.每秒钟帧数愈多,所显示的动作就会越流畅.通常,要避免动作不流畅的最低是30.某些计算机视频格式,每秒只能提供15帧. FPS"也可以理解为我们常说的"刷新率(单位为Hz)",例如我们常在CS游戏里说的"FPS值".我们在装机选购显卡和显

  • python中opencv 直方图处理

    目录 直方图处理 直方图的含义 绘制直方图 使用Numpy绘制直方图 使用OpenCV绘制直方图 使用掩模绘制直方图 直方图均衡化 直方图均衡化原理 直方图均衡化处理 pyplot 模块介绍 subplot 函数 imshow函数 直方图处理 直方图从图像内部灰度级的角度对图像进行表述从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的. 直方图的含义 直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数.从直方图的图形上观察,横坐标是图像中各像素点

  • Flutter中网络图片加载和缓存的实现

    前言 应用开发中经常会碰到网络图片的加载,通常我们会对图片进行缓存,以便下次加载同一张图片时不用再重新下载,在包含有大量图片的应用中,会大幅提高图片展现速度.提升用户体验且为用户节省流量.Flutter本身提供的Image Widget已经实现了加载网络图片的功能,且具备内存缓存的机制,接下来一起看一下Image的网络图片加载的实现. 重温小部件Image 常用小部件Image中实现了几种构造函数,已经足够我们日常开发中各种场景下创建Image对象使用了. 有参构造函数: Image(Key k

  • Flutter 图片开发核心技能快速掌握教程

    目录 正文 使用网络图片 把网络图片缓存到磁盘 使用 assets 图片 适配浅色与深色模式 在不同的设备使用不同分辨率的图片 关于设备 dpr 不完全匹配的处理 忽略 dpr 信息 使用相册图片 使用相机拍摄的图片 使用内存图片 图片用做装饰 图片预加载 centerSlice centerSlice 只能放大,不能缩小. 全局缓存 ImageCache 的设置 图片类之间的关系 ImageProvider obtainKey(ImageConfiguration) 方法 resolve(Im

  • Flutter加载图片流程之ImageProvider源码示例解析

    目录 加载网络图片 ImageProvider resolve obtainKey resolveStreamForKey loadBuffer load(被废弃) evict 总结 困惑解答 加载网络图片 Image.network()是Flutter提供的一种从网络上加载图片的方法,它可以从指定的URL加载图片,并在加载完成后将其显示在应用程序中.本节内容,我们从源码出发,探讨下图片的加载流程. ImageProvider ImageProvider是Flutter中一个抽象类,它定义了一种

  • Javascript基础_嵌入图像的简单实现

    img元素允许我们在HTML文档里嵌入图像. 要嵌入一张图像需要使用src和alt属性,代码如下: <img src="../img/example/img-map.jpg" alt="Products Image" width="580" height="266" /> 显示效果: 1 在超链接里嵌入图像 img元素的一个常见用法是结合a元素创建一个基于图像的超链接,代码如下: <a href="

随机推荐