本文为大家分享了Flutter实现列表项的具体代码,供大家参考,具体内容如下
创建achievement_view_list_item.dart文件,具体的实现每一个列表项。
import 'package:flutter/material.dart'; // 创建类,成就目标 class Target { // 常量,构建函数 const Target({ // 自变量,目标名称 this.name, // 自变量,目标奖励 this.reward }); // 最终值,成就目标名称 final String name; // 最终值,成就目标奖励 final String reward; } // 定义数据类型,目标改变回调 typedef void TargetChangedCallback( // 类型参数,目标 Target target, // 类型参数,是否新目标 bool nowTarget ); // 创建类,成就视图列表项目,继承StatelessWidget(无状态的控件) class AchievementViewItem extends StatelessWidget { // 构造函数 AchievementViewItem({ // 目标参数,传递目标 Target target, // 自变量,是否新目标 this.nowTarget, // 自变量,对目标的改变 this.onTargetChanged }) : // 接收传递的目标 target = target, // 调用父类 super( /* * 控件和元素的标识符: * 将其对象的标识用作其值 * 用于将控件的标识绑定到用于生成该控件的对象的标识 */ key: new ObjectKey(target) ); // 类成员,存储目标 final Target target; // 类成员,存储是否新目标 final bool nowTarget; // 类成员,对目标的改变 final TargetChangedCallback onTargetChanged; // 类函数,获得颜色 Color _getColor(BuildContext context) { /* * 是否新目标 * 是:返回灰色 * 否:返回主题的背景色 */ return nowTarget ? Colors.black54 : Theme.of(context).primaryColor; } // 类函数,获得文本样式 TextStyle _getNameTextStyle(BuildContext context) { // 如果不是新目标,返回文本样式控件 if (!nowTarget) return new TextStyle( // 绘制文本的大小:16.0 fontSize: 16.0, // 绘制文本时使用的颜色:黑色 color: Colors.black, // 绘制文本时加粗字体 fontWeight: FontWeight.bold, ); // 返回文本样式控件 return new TextStyle( fontSize: 16.0, // 绘制文本时使用的颜色:灰色 color: Colors.black54, // 绘制文本时加粗字体 fontWeight: FontWeight.bold, // 在文本附近绘制的装饰:文本中绘制一条横线 decoration: TextDecoration.lineThrough, ); } // 类函数,获得文本样式 TextStyle _getRewardTextStyle(BuildContext context) { // 如果不是新目标,返回文本样式控件 if (!nowTarget) return new TextStyle( // 绘制文本的大小:13.0 fontSize: 13.0, // 绘制文本时使用的颜色:黑色 color: Colors.black, ); // 返回文本样式控件 return new TextStyle( // 绘制文本的大小:13.0 fontSize: 13.0, // 绘制文本时使用的颜色:灰色 color: Colors.black54, // 在文本附近绘制的装饰:文本中绘制一条横线 decoration: TextDecoration.lineThrough, ); } // 覆盖此函数以构建控件 @override Widget build(BuildContext context) { // 返回值:创建列表项,通常包含图标和一些文本 return new ListItem( // 当用户点击此列表项时调用 onTap: () { // 调用对目标的改变函数 onTargetChanged(target, !nowTarget); }, // 要在标题之前显示的控件:创建圆形头像控件 leading: new CircleAvatar( // 填充圆形的颜色:获得颜色函数 backgroundColor: _getColor(context), // 子控件:文字控件 child: new Text('囧'), ), // 列表项目的主要内容:创建堆栈布局控件 title: new Stack( /* * 列表项目的主要内容: * 定位位置 * 左边与顶部 * 文本控件 * 文本内容 * 获得文本样式函数 */ children:[ new Positioned( left: 0.0, top: 0.0, child: new Text( target.name, style: _getNameTextStyle(context), ) ), new Positioned( left: 0.0, top: 20.0, child: new Text( '奖励'+'n'+target.reward, style: _getRewardTextStyle(context), ) ), ] ) ); } }
创建achievement_view_list.dart文件,创建列表。
import 'package:flutter/material.dart'; import 'achievement_view_list_item.dart'; // 创建类,成就视图列表项目,继承StatefulWidget(有状态的控件) class AchievementViewList extends StatefulWidget { // 构造函数 AchievementViewList({ // 自变量,目标列表 this.targets, // 控件和元素的标识符 Key key, }) : // 调用父类 super( // 使用父类的控件和元素标识符 key: key ); // 最终值,目标列表 final Listtargets; /* * 覆盖具有相同名称的超类成员 * 在树中的给定位置为此控件创建可变状态 * 子类应重写此方法以返回其关联的State子类新创建的实例 */ @override _AchievementViewState createState() => new _AchievementViewState(); } /* * 关联State子类的实例 * 继承State:StatefulWidget(有状态的控件)逻辑和内部状态 */ class _AchievementViewState extends State { // 类成员,存储成就集合 Set _achievements = new Set (); /* * 类函数,成就改变 * target:传递目标 * nowTarget:是否新目标 */ void _achievementsChanged(Target target, bool nowTarget) { // 通知框架此对象的内部状态已更改 setState((){ /* * 如果是新目标 * 存储成就集合,增加目标 * 否则,移除目标 */ if (nowTarget) _achievements.add(target); else _achievements.remove(target); }); } // 覆盖此函数以构建依赖于动画的当前状态的控件 @override Widget build(BuildContext context) { // 返回值,创建包含列表项的可滚动列表 return new ListTile( /* * 要在此列表中显示的控件 * 迭代当前配置的目标列表中的目标 * 为每一个调用函数创建成就目标类 */ children: widget.targets.map( (Target target) { // 返回值,创建成就目标类 return new AchievementViewItem( // 传递目标:本轮迭代中的目标 target: target, // 是否新目标:如果目标在成就集合中,则返回true nowTarget: _achievements.contains(target), // 对目标的改变:类函数,成就改变 onTargetChanged: _achievementsChanged, ); } ).toList() ); } }
创建achievement_view.dart文件,传递列表中显示的数据。
import 'package:flutter/material.dart'; import 'achievement_view_list.dart'; import 'achievement_view_list_item.dart'; class AchievementView extends StatelessWidget { @override Widget build(BuildContext context) { return new AchievementViewList(targets: _kTargets); } } final List_kTargets = [ new Target(name: '生存100天', reward: "金钱¥2500t最高能量+20"), new Target(name: '大学毕业', reward: "获得毕业学位t金钱¥5000t最高情绪+30"), new Target(name: '获得¥5000', reward: "获得信用卡"), new Target(name: '购买廉价的公寓', reward: "最高能量+60t最高饥饿度+30"), new Target(name: '购买普通的公寓', reward: "最高能量+80t最高饥饿度+50"), new Target(name: '生存100天', reward: "金钱¥2500t最高能量+20"), new Target(name: '大学毕业', reward: "获得毕业学位t金钱¥5000t最高情绪+30"), new Target(name: '获得¥5000', reward: "获得信用卡"), new Target(name: '购买廉价的公寓', reward: "最高能量+60t最高饥饿度+30"), new Target(name: '购买普通的公寓', reward: "最高能量+80t最高饥饿度+50"), ];