GridView组件。一个可滚动的二维空间数组。

在使用无限加载滚动列表的时候,最先使用的还是ListView组件。但若是要一行显示2列或者更多列的滚动列表,GridView组件更为方便。如下

在向服务器请求数据后,服务器往往会返回一段json字符串。而我们要想更加灵活的使用数据的话需要把json字符串转化成对象。由于flutter只提供了json to Map。而手写反序列化在大型项目中极不稳定,很容易导致解析失败。所有最好使用json_serializable 自动反序列化。

首先在pubspec.yaml文件中dependencies添加json_annotation,dev_dependencies添加json_serializable

dependencies:
flutter:
sdk: flutter # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
json_annotation: ^2.0.0
cached_network_image: ^0.5.1
transparent_image: ^0.1.0
dio: ^1.0.9
video_player: ^0.7.2
flutter_spinkit: ^2.1.0 dev_dependencies:
build_runner: ^1.0.0
json_serializable: ^2.0.0
flutter_test:
sdk: flutter

以json_serializable的方式创建model类

创建一个模型picmodel.dart

import 'package:json_annotation/json_annotation.dart';
part 'picmodel.g.dart'; @JsonSerializable()
class PicModel {
PicModel(this.createdAt,this.publishedAt,this.type,this.url); String createdAt;
String publishedAt;
String type;
String url; factory PicModel.fromJson(Map<String,dynamic> json) => _$PicModelFromJson(json);
}

此时这个picmodel.g.dart文件是不存在的,必须运行代码生成器来为我们生成序列化模板。通过在我们的项目根目录下运行flutter packages pub run build_runner build,我们可以在需要时为我们的model生成json序列化代码。 这触发了一次性构建,它通过我们的源文件,挑选相关的并为它们生成必要的序列化代码。

然后建立find.dart文件,搭建基础构架。引入相关的库

import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:convert';
import 'package:flutter_yuan/models/picmodel.dart';
import 'package:cached_network_image/cached_network_image.dart'; class FindPage extends StatefulWidget{
FindPage({Key key}):super(key:key);
@override
createState() => new _FindPageState();
} class _FindPageState extends State<FindPage> {
List<PicModel> picList = new List();
int page = 1;
@override
void initState() {
super.initState();
_getPicList();
}
@override
Widget build(BuildContext context) {
return new Scaffold( );
}
}

我们需要通过_getPicList来异步请求数据:

_getPicList() async{
String url = 'https://www.apiopen.top/meituApi?page=$page';
var httpClient = new HttpClient();
try {
var req = await httpClient.getUrl(Uri.parse(url));
var res = await req.close();
// print(res);
if(res.statusCode == HttpStatus.OK) {
var jsonString = await res.transform(utf8.decoder).join();//将结果转换成字符串拼接
// print(jsonString);
Map data = jsonDecode(jsonString);//格式化成Map对象
print(data);
List pics = data['data'];
List<PicModel> items = new List();
for (var value in pics) {
items.add(new PicModel.fromJson(value));
};
setState(() { this.picList.addAll(items);
this.page ++;
});
}
} catch (e) { }
}

然后构建Widget:

Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('美图'),
centerTitle: true,
),
body: new GridView.builder(
padding: const EdgeInsets.all(10.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
),
itemCount: picList.length,
itemBuilder: (BuildContext context, int index) {
if(index == picList.length - 1 ){
_getPicList();
}
return buildItem(picList[index]);
},
),
);
}

使用GridView.builder组件来构建列表,通过gridDelegate属性来对列表样式进行丰富。crossAxisCount属性可以设置每行的列数,打造你的瀑布流布局。

buidItem方法对图片的样式布局。

buildItem(item) {
return new GestureDetector(
onTap: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) =>
new Scaffold(
appBar: new AppBar(
title: new Text('图片详情'),
),
body: new Center(
child: new Container(
width: 300.0,
child: new CachedNetworkImage(
imageUrl: item.url,
fit: BoxFit.fitWidth,
),
)
),
)
)
);
},
child: new CachedNetworkImage(
errorWidget: new Icon(Icons.error),
imageUrl: item.url,
fadeInDuration: new Duration(seconds: 3),
fadeOutDuration: new Duration(seconds: 1),
),
);
}

Flutter中打造多行列列表GridView组件的使用的更多相关文章

  1. flutter网格布局之GridView组件

    前面总结了使用ListView来实现列表,但是,有的时候,数据量很大,需要使用矩阵方式排列才能更清晰的展示数据,在flutter中,可以使用网格列表组件GridView来实现这个布局. GridVie ...

  2. Flutter 中那么多组件,难道要都学一遍?

    在 Flutter 中一切皆是 组件,仅仅 Widget 的子类和间接子类就有 350 多个,整理的 Flutter组件继承关系图 可以帮助大家更好的理解学习 Flutter,回归正题,如此多的组件到 ...

  3. Flutter——GridView组件(网格列表组件)

    GridView组件的常用参数: 名称 类型 说明 scrollDirection Axis 滚动方法 padding EdgeInsetsGeometry 内边距 resolve bool 组件反向 ...

  4. flutter中的列表组件

    列表布局是我们项目开发中最常用的一种布局方式.Flutter 中我们可以通过 ListView 来定义列表项,支持垂直和水平方向展示.通过一个属性就可以控制列表的显示方向.列表有以下分类:  垂直列表 ...

  5. 在Flutter中嵌入Native组件的正确姿势是...

    引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...

  6. Flutter中的普通路由与命名路由(Navigator组件)

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

  7. Flutter中的基础组件之一

    一.Text文本组件(单一格式的文本) 是具有单一风格的文本字符串,可以跨多行显示,也可全部显示在同一行中,具体显示样子,取决于布局约束. 常用属性: 1.overflow : TextOverflo ...

  8. flutter中的按钮组件

    Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton.IconButton.OutlineButton.ButtonBar.Floati ...

  9. Flutter中的日期、格式化日期、日期选择器组件

    Flutter中的日期和时间戳 //獲取當前日期 DateTime _nowDate = DateTime.now(); print(_nowDate);//2019-10-29 10:57:20.3 ...

随机推荐

  1. js 获取当前日期或者前、后N天yyyy-MM-dd的方法

    //js获取当前日期.当前日期前.后N天的标准年月日 //day=0为当前天,day=7为前7天,day=-7为当前日期的后7天 function getstartdate(day) {        ...

  2. python Twisted安装报错

    系统 mac pro 错误信息: IOError: [Errno 63] File name too long: '/var/folders/72/byjy11cs0dj_z3rjtxnj_nn000 ...

  3. 判断网络远端服务器是否断开连接(心跳连接:socket.sendUrgentData)

    1.socket类的方法isClosed().isConnected().isInputStreamShutdown().isOutputStreamShutdown()等,这些方法都是本地端的状态, ...

  4. springMVC文件上传与下载(六)

    1..文件上传 在springmvc.xml中配置文件上传解析器 <!-- 上传图片配置实现类,id必须为这个 --> <bean id="multipartResolve ...

  5. 【工具测试】Acunetix 11-登录后扫描的功能

    1.概要 在测试的过程中,会给一些只有登录口的测试站点,只有登录后才能访问更多的页面. Acunetix 11的登录后扫描功能摸索了老半天,原来这么神奇.学习了! 2.操作 登录之后 - [Add T ...

  6. 【vim】自动补全 Ctrl+n

    Vim 默认有自动补全的功能.的确这个功能是很基本的,并且可以通过插件来增强,但它也很有帮助.方法很简单. Vim 尝试通过已经输入的单词来预测单词的结尾. 比如当你在同一个文件中第二次输入 &quo ...

  7. 利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)

    实现功能描述: 1.实现搜索框的智能提示 2.第二次浏览器缓存结果 3.实现仿百度搜索 <!DOCTYPE html> <html xmlns="http://www.w3 ...

  8. 面向对象编程其实很简单——Python 面向对象(初级篇)

    出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...

  9. Java中BigDecimal类介绍及用法

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...

  10. python接口自动化测试七:获取登录的Cookies,并关联到下一个请求

    获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cookies=loginCookies 此方法需每一次都调用登录方法,并且每一次发送请求 ...