Flutter中打造多行列列表GridView组件的使用
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组件的使用的更多相关文章
- flutter网格布局之GridView组件
前面总结了使用ListView来实现列表,但是,有的时候,数据量很大,需要使用矩阵方式排列才能更清晰的展示数据,在flutter中,可以使用网格列表组件GridView来实现这个布局. GridVie ...
- Flutter 中那么多组件,难道要都学一遍?
在 Flutter 中一切皆是 组件,仅仅 Widget 的子类和间接子类就有 350 多个,整理的 Flutter组件继承关系图 可以帮助大家更好的理解学习 Flutter,回归正题,如此多的组件到 ...
- Flutter——GridView组件(网格列表组件)
GridView组件的常用参数: 名称 类型 说明 scrollDirection Axis 滚动方法 padding EdgeInsetsGeometry 内边距 resolve bool 组件反向 ...
- flutter中的列表组件
列表布局是我们项目开发中最常用的一种布局方式.Flutter 中我们可以通过 ListView 来定义列表项,支持垂直和水平方向展示.通过一个属性就可以控制列表的显示方向.列表有以下分类: 垂直列表 ...
- 在Flutter中嵌入Native组件的正确姿势是...
引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...
- Flutter中的普通路由与命名路由(Navigator组件)
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...
- Flutter中的基础组件之一
一.Text文本组件(单一格式的文本) 是具有单一风格的文本字符串,可以跨多行显示,也可全部显示在同一行中,具体显示样子,取决于布局约束. 常用属性: 1.overflow : TextOverflo ...
- flutter中的按钮组件
Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton.IconButton.OutlineButton.ButtonBar.Floati ...
- Flutter中的日期、格式化日期、日期选择器组件
Flutter中的日期和时间戳 //獲取當前日期 DateTime _nowDate = DateTime.now(); print(_nowDate);//2019-10-29 10:57:20.3 ...
随机推荐
- mysql 案例 ~ pt校验工具介绍
简介:今天咱们来聊聊PT校验工具pt-table-checksum 注意事项: 1. 根据测试,需要一个即能登录主库,也能登录从库的账号: 2. 只能指定一个host,必须为主库的IP: ...
- systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。
1.centos 检查服务是否开机自启 (ntpd是原生的服务,mysql是注册的服务) 参考:1.http://man.linuxde.net/systemctl
- OpenCV:Debug和Release模式 && 静态和动态编译
1.Release和Debug的区别 Release版称为发行版,Debug版称为调试版. Debug中可以单步执行.跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢.Release版运行速度较 ...
- R-CNN论文详解(转载)
这几天在看<Rich feature hierarchies for accurate object detection and semantic segmentation >,觉得作者的 ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- Android:视频(VideoView/MediaPlayer)
Android之视频播放 VideoView if(android.os.Environment.getExternalStorageState().equals(android.os.Environ ...
- Expm 3_2 寻找最邻近的点对
[问题描述] 设p1=(x1,y1), p2=(x2,y2), … , pn=(xn,yn) 是平面上n个点构成的集合S,设计和实现找出集合S中距离最近点对的算法. 每一个格子最多只能存在一个点, ...
- 【转载】linux下升级npm以及node
原文:http://blog.csdn.net/qq_16339527/article/details/73008708 npm升级 废话不多说,直接讲步骤.先从容易的开始,升级npm. npm这款包 ...
- 一个简单 JDK 动态代理的实例
动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsat ...
- python通过Cookie跳过登录验证码
1.通过浏览器获取登录cookie,找到重要的两个参数“BAIDUID”和“BDUSS”: 2.编写Selenium自动化测试脚本,跳过登录. from selenium import webdriv ...