整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

如何利用Flutter实现好友列表(内涵源码)

如何利用Flutter实现好友列表(内涵源码)

早前的《HelloWorld》公开课,资深大前端开发工程师阿佑老师为我们详细介绍了如何利用Flutter做界面开发。学员们反馈意犹未尽,问还没有关于Flutter的公开课。4月24日,阿佑老师带来了Flutter系列下半部分的内容—Flutter列表开发与界面搭建,快去看看吧。

Flutter列表开发

以下面这个好友列表为例。我们先来分析一下,要实现这个列表都要做哪些工作,首先要先做一个列表的载体容器FriendList,用于显示列表、加载数据、管理状态。其次要对用户做单行布局,设计数据模型和数据相关处理存放的位置,并且和数据进行绑定。

分析好需求后,接下来直接上代码,先来新建一个frined类来设计好列表的数据模型,整个数组模型需要用户的头像、姓名、Email这三个信息,具体代码如下。

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_demo/friend.dart';
import 'package:flutter_demo/friend_detail.dart';
import 'package:flutter_demo/friend_item.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';

class FriendList extends StatefulWidget {
  FriendList({Key key}) : super(key: key);

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


class _FriendListState extends State<FriendList> {

  List<Friend> _friends=[];
  var url="https://randomuser.me/api/?results=30";

  RefreshController _refreshController=RefreshController(initialRefresh: false);

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

    _loadFriendData();
  }

  _loadFriendData() async{
    HttpClient httpClient=new HttpClient();
    HttpClientRequest request=await httpClient.getUrl(Uri.parse(url));
    HttpClientResponse response=await request.close();
    var jsonString=await response.transform(utf8.decoder).join();
    setState(() {
      _friends=Friend.resolveDataFromReponse(jsonString);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title: Text('好友列表'), 
      ),
      body: SmartRefresher(
        controller: _refreshController,
        enablePullDown: true,
        header: ClassicHeader(
          refreshingText: '正在加载中...',
          idleText: '下拉刷新',
          completeText:'加载完成',
          failedText: '数据刷新异常',
          releaseText:'松开刷新'
        ),
        enablePullUp: true,
        footer: ClassicFooter(
          idleText:'加载更多数据',
          loadingText:'玩命加载中...',
          noDataText:'没有更多数据',
          // noMoreIcon: Icon(Icons.account_balance_wallet),
        ),
        child: ListView.builder(
          itemCount: _friends.length,
          itemBuilder: _buildItem,
        ),
        onRefresh: _onRefresh,
        onLoading: _onLoading,
      ),
    );
  }

  void _onRefresh() async{
    await Future.delayed(Duration(seconds: 2),(){
      // _refreshController.refreshCompleted();
      _refreshController.refreshFailed();
    });
  }

    void _onLoading() async{
    await Future.delayed(Duration(seconds: 2),(){
      _refreshController.loadComplete();
    });
  }

  Widget _buildItem(BuildContext context, int index) {
    Friend item=_friends[index];
    return FriendItem(item);
  }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293复制代码类型:[html]

接下来我们调起模拟器,可以看到用户数据已经出来了,但是这个列表离我们的预期还很远,需要往里面添加样式,由于每个用户的列表样式都是一样的,所以我们可以新建friend_item.dart文件来实现列表的样式。

由于文章篇幅所限,这里我们就不贴源代码了,感兴趣的同学可以直接点击跨平台开发之Flutter入门实战(下)观看公开课的视频回放,有一点值得注意,上拉加载更多的功能这里是用插件来实现的。除此之外,也可以通过ScrollController属性,监听ListView滑动事件来实现。

Flutter界面结构搭建

做移动端开发,界面的搭建是避不开的。当先主流的界面搭建有两种方式,一种是如下图所示,底部有四个选项卡来做界面切换。底部切换的四个界面关系是平级的,不存在先后关系

另外一种方式就是界面跳转,从一个界面跳转到另一个界面,这种界面的管理方式是通过导航控制器通过栈的形式来管理子控制器(先进后出)。显示在导航控制器上得view永远是栈顶控制器的view


Flutter第三方插件

最后,我们再来说下第三方插件,有很多同学私信老师说flutter开发有那么多控件,不知道在哪能找到。其实可以通过下面的这个查询网址来找到你想要的控件。

查询网址:https://pub.dev/flutter/packages

在找到你想要的插件后,执行两个步骤,在项目的pubspec.yaml文件添加配置,在项目路径下执行flutterpubget。这样你就可以按照文档来使用这个控件了。

讲师介绍

阿佑老师,从2013年开始做软件开发,做过移动端、RN以及flutter。对于移动端跨平台开发有丰富的开发经验

《Hello,World公开课》是由开课吧推出的面向广大开发工程师的免费加餐课,集结业内名师大咖,聚焦热门技术和实战解决方案,以专业知识分享交流为桥梁,链接正在创造世界的一群科技主力们,向初心致敬,为技术发烧。无论你是初入职场的应届生,还是准备升职加薪的职场精英,相信这里都有你需要的养料。

  • 使用过word的同学应该都知道,列表基本分两种,一种带数字的有序列表,或者是圆点或方点等符号的无序列表
  • 在HTML中,我们使用<ol></ol>标签去创建有序列表,然后使用<li></li>去代表列表项,列表元素就放置其中。如下方所示
<ol>
      <li>开始标记</li>
      <li>结束标记</li>
      <li>实际元素</li>
    </ol>

  • HTML中使用<ul></ul>标签去代表无序列表,如下方所示:
<p>学习网页的基本语言有无数的理由。以下是其中的 5 个:</p>
    <ul>
      <li>能够使用基本的 Web 开发语言</li>
      <li>手工制作漂亮的网站,而不是依赖像 Wordpress 或 Wix 这样的工具</li>
      <li>构建 Web 应用程序</li>
      <li>给朋友留下深刻印象</li>
      <li>玩得开心</li>
    </ul>

结合上一章,本次我们需要实现这样的一个页面:

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 吴小鹏

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

「itchat」(开源的微信个人接口)来获取一些公开的好友信息,使用itchat.get_friends(),

我们可以获取微信好友头像、性别、省份、城市、年龄等具体信息。

好友头像

我们先拉取好友头像试一下,「itchat」里的get_head_img可以获取每个好友的头像:

def headImg():
 itchat.login()
 friends=itchat.get_friends(update=True)
 # itchat.get_head_img() 获取到头像二进制,并写入文件,保存每张头像
 for count, f in enumerate(friends):
 # 根据userName获取头像
 img=itchat.get_head_img(userName=f["UserName"])
 imgFile=open("photo/" + str(count) + ".jpg", "wb")
 imgFile.write(img)
 imgFile.close()

photo文件夹用于保存头像图片,遍历好友列表,根据下标命名头像,到这里可以看到文件夹里已经保存了所有好友的头像。

头像信息比较隐私,就不公布啦~

性别分布

当我们使用「itchat」的get_friends()函数可以获取很多好友信息,包括性别,所以这里只需要将获取到的好友性别信息提取出来制图就可以:

def analysisSex():
 itchat.login()
 friends=itchat.get_friends()
 sex_count=dict()
 for f in friends:
 if f["Sex"]==1: # man
 sex_count["man"]=sex_count.get("man", 0) + 1
 elif f["Sex"]==2: # women
 sex_count["women"]=sex_count.get("women", 0) + 1
 else: # unknown
 sex_count["unknown"]=sex_count.get("unknown", 0) + 1
 # 柱状图展示
 for i, key in enumerate(sex_count):
 plt.bar(key, sex_count[key])
 plt.savefig("analysisSex.png") #保存图片
 plt.ion()
 plt.close()

结果如下:

个性签名

在获取的好友信息中Signature字段对应着好友的签名,我们直接获取这部分信息,然后保存下来,处理过表情等特殊字符,然后制作词云图。

def AnalysisSignature():
 itchat.login()
 friends=itchat.get_friends(update=True)
 file=open('AnalysisSignature.txt', 'a', encoding='utf-8')
 for f in friends:
 signature=f["Signature"].strip().replace("emoji", "").replace("span", "").replace("class", "")
 # 正则匹配
 rec=re.compile("1f\d+\w*|[<>/=]")
 signature=rec.sub("", signature)
 file.write(signature + "\n")

"stay hungry, stay foolish" "不舍爱与自由"

大家对生活都是积极向上的,希望每个人都能成为更好的自己!

地区分布

为了统计好友的地区分布,所以要用到好友信息的province字段,直接对province进行统计,然后可视化出来得到。

# 省份分析
def analysisProvince():
 friends_info=get_friends_info()
 df=pd.DataFrame(friends_info)
 province_count=df.groupby('province', as_index=True)['province'].count().sort_values()
 temp=list(map(lambda x: x if x !='' else '未知', list(province_count.index)))
 # 画图
 page=Page()
 style=Style(width=1100, height=600)
 style_middle=Style(width=900, height=500)
 attr, value=temp, list(province_count)
 chart1=Map('好友分布(中国地图)', **style.init_style)
 chart1.add('', attr, value, is_label_show=True, is_visualmap=True, visual_text_color='#000')
 page.add(chart1)
 chart2=Bar('好友分布柱状图', **style_middle.init_style)
 chart2.add('', attr, value, is_stack=True, is_convert=True,
 label_pos='inside', is_legend_show=True, is_label_show=True)
 page.add(chart2)
 page.render('analysisProvince.html')

比较明显的一个点是,我们的好友大多来自我们生活过的地方,安徽和上海这两个地区好友数量都明显高于其他省份。

号主户籍安徽,利用城市信息看一下我的朋友都在哪里。

从下面的好友数量来看,号主明显是个安庆人。

你们可以直接修改源码的省份参数,获取你想了解的省份的好友分布。