Flutter质感设计之列表项

 更新时间:2018年08月23日 10:46:05   作者:何小有  
这篇文章主要为大家详细介绍了Flutter质感设计之列表项,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了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: <Widget> [
     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 List<Target> targets;
 /*
  * 覆盖具有相同名称的超类成员
  * 在树中的给定位置为此控件创建可变状态
  * 子类应重写此方法以返回其关联的State子类新创建的实例
  */
 @override
 _AchievementViewState createState() => new _AchievementViewState();
}
/*
 * 关联State子类的实例
 * 继承State:StatefulWidget(有状态的控件)逻辑和内部状态
 */
class _AchievementViewState extends State<AchievementViewList> {
 // 类成员,存储成就集合
 Set<Target> _achievements = new Set<Target>();
 /*
  * 类函数,成就改变
  * 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<Target> _kTargets = <Target>[
 new Target(name: '生存100天', reward: "金钱¥2500\t最高能量+20"),
 new Target(name: '大学毕业', reward: "获得毕业学位\t金钱¥5000\t最高情绪+30"),
 new Target(name: '获得¥5000', reward: "获得信用卡"),
 new Target(name: '购买廉价的公寓', reward: "最高能量+60\t最高饥饿度+30"),
 new Target(name: '购买普通的公寓', reward: "最高能量+80\t最高饥饿度+50"),
 new Target(name: '生存100天', reward: "金钱¥2500\t最高能量+20"),
 new Target(name: '大学毕业', reward: "获得毕业学位\t金钱¥5000\t最高情绪+30"),
 new Target(name: '获得¥5000', reward: "获得信用卡"),
 new Target(name: '购买廉价的公寓', reward: "最高能量+60\t最高饥饿度+30"),
 new Target(name: '购买普通的公寓', reward: "最高能量+80\t最高饥饿度+50"),
];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • WebView的介绍与简单实现Android和H5互调的方法

    WebView的介绍与简单实现Android和H5互调的方法

    这篇文章主要给大家介绍了关于WebView与简单实现Android和H5互调的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Android使用HttpURLConnection实现网络访问流程

    Android使用HttpURLConnection实现网络访问流程

    早些时候其实我们都习惯性使用HttpClient,但是后来Android6.0之后不再支持HttpClient,需要添加Apache的jar才行,所以,就有很多开发者放弃使用HttpClient了,HttpURLConnection毕竟是标准Java接口(java.net) ,适配性还是很强的
    2022-12-12
  • Android用于加载xml的LayoutInflater源码超详细分析

    Android用于加载xml的LayoutInflater源码超详细分析

    今天不想去聊一些Android的新功能,新特性之类的东西,特别想聊一聊这个老生常谈的话题:LayoutInflater,感兴趣的朋友来看看吧
    2022-08-08
  • Android实现今日头条订阅频道效果

    Android实现今日头条订阅频道效果

    这篇文章主要为大家详细介绍了Android实现今日头条订阅频道效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Android自定义相机Camera实现手动对焦的方法示例

    Android自定义相机Camera实现手动对焦的方法示例

    这篇文章主要介绍了Android自定义相机Camera实现手动对焦的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Flutter学习之创建一个内嵌的navigation详解

    Flutter学习之创建一个内嵌的navigation详解

    我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的页面,从而达到页面调整的目的。本文就来聊聊如何创建一个内嵌的navigation吧
    2023-03-03
  • Android开发中使用achartengine绘制各种图表的方法

    Android开发中使用achartengine绘制各种图表的方法

    这篇文章主要介绍了Android开发中使用achartengine绘制各种图表的方法,结合具体实例形式分析了Android基于图表生成类库achartengine进行图表绘制的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Flutter WebView 预加载实现方法(Http Server)

    Flutter WebView 预加载实现方法(Http Server)

    这篇文章主要介绍了Flutter WebView 预加载实现方法,包括资源的配置,资源的下载和存储,版本的管理,如何根据实际url获取对应HttpServer bind的url等,需要的朋友可以参考下
    2022-05-05
  • Android实现文件按时间先后顺序排列显示的示例代码

    Android实现文件按时间先后顺序排列显示的示例代码

    在很多Android应用中,需要管理和展示本地文件,对文件按最后修改时间排序展示,能让用户直观地了解文件的创建或修改顺序,从而更方便地查找最新或最旧的文件,本文将介绍如何在Android平台上获取指定目录下的文件列表,并按照时间先后排序,需要的朋友可以参考下
    2025-04-04
  • Android开发实现实时检测蓝牙连接状态的方法【附源码下载】

    Android开发实现实时检测蓝牙连接状态的方法【附源码下载】

    这篇文章主要介绍了Android开发实现实时检测蓝牙连接状态的方法,涉及Android针对蓝牙连接状态的监测操作相关实现技巧,需要的朋友可以参考下
    2017-11-11

最新评论