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"),
];

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

(0)

相关推荐

  • Flutter质感设计之模态底部面板

    模态底部面板是菜单或对话框的替代方案,可防止用户与其他控件进行互动,可以使用showModalBottomSheet函数创建和显示模态底部面板. import 'package:flutter/material.dart'; class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new

  • Flutter质感设计之弹出菜单

    PopupMenuButton控件即弹出菜单控件,点击控件会出现菜单. import 'package:flutter/material.dart'; class MenusDemo extends StatefulWidget { @override _MenusDemoState createState() => new _MenusDemoState(); } class _MenusDemoState extends State<MenusDemo> { String _body

  • Flutter质感设计之底部导航

    BottomNavigationBar即底部导航栏控件.显示在应用底部的质感设计控件,用于在少量视图中切换.底部导航栏包含多个以标签.图标或两者搭配的形式显示在项目底部的项目,提供了应用程序的顶级视图之间的快速导航.对于较大的屏幕,侧面导航可能更好. 创建navigation_icon_view.dart文件,定义一个NavigationIconView类,用于管理BottomNavigationBarItem(底部导航栏项目)控件的样式.行为与动画. import 'package:flutt

  • Flutter质感设计之直接输入

    Input控件是质感设计的文本输入控件,它在用户每次输入时都会调用onChanged回调时,都会更新字段值,还可以实时的对用户输入进行响应. import 'package:flutter/material.dart'; class MyApp extends StatefulWidget { @override _MyApp createState() => new _MyApp(); } class _MyApp extends State<MyApp> { // InputValu

  • Flutter质感设计之持久底部面板

    持久性底部面板可以用于补充应用主要内容的信息,即使用户与应用程序的其他控件进行互动,也仍然可以看到持久的底部面板.可以使用Scaffold.showBottomSheet函数创建和显示持久性底部面板. import 'package:flutter/material.dart'; class MyApp extends StatefulWidget { @override _MyApp createState() => new _MyApp(); } class _MyApp extends S

  • Flutter质感设计之进度条

    LinearProgressIndicator控件是质感设计中的线性进度指示器,具体内容如下 import 'package:flutter/material.dart'; class ActionViewEcology extends StatelessWidget { /* * 构建函数,传递参数 * 最大能量值 * 最大饥饿值 * 最大情绪值 * 当前能量值 * 当前饥饿值 * 当前情绪值 */ ActionViewEcology({ this.maximumEmergy, this.ma

  • Flutter进阶质感设计之标签栏

    在质感设计的控件中,有一个显示水平的一行选项卡,通常作为AppBar控件的一部分创建,并与TabBarView控件结合使用. import 'package:flutter/material.dart'; /* * 枚举类,标签演示样式 * 图标和文本 * 仅图标 * 仅文本 */ enum TabsDemoStyle { iconsAndText, iconsOnly, textOnly } /* * 页面类 * 图标 * 文本 */ class _Page { _Page({ this.ic

  • Flutter质感设计之表单输入

    FormField控件是单一表单字段,这个控件维护表单字段的当前状态,以便更新和验证错误能在UI中可见.TextField控件就是在FormField中包装了一个Input控件(后面的文章讲解),FormField维护输入的当前值,使您不需要自己管理它,更容易一次保存,重置或验证多个字段. import 'package:flutter/material.dart'; class MyApp extends StatefulWidget { @override _MyApp createStat

  • Flutter质感设计之列表项

    本文为大家分享了Flutter实现列表项的具体代码,供大家参考,具体内容如下 创建achievement_view_list_item.dart文件,具体的实现每一个列表项. import 'package:flutter/material.dart'; // 创建类,成就目标 class Target { // 常量,构建函数 const Target({ // 自变量,目标名称 this.name, // 自变量,目标奖励 this.reward }); // 最终值,成就目标名称 fina

  • extjs 列表框(multiselect)的动态添加列表项的方法

    因为它这个是创建时自动加载的ArrayStore(关键字是:data: ds),没有动态增加的示例,但我们的项目需要有三个列表框,并且后两个的内容要根据第一个列表框内容动态的加载,因此要在选择第一个列表框的内容时,动态填充后两个的内容.我比较佩服exjts的示例写作人员,这些应该在示例中体现的功能,他们都没有写到,包括之前的2.2版本的示例,网上也没有搜索到,害我找了一天如何动态控制列表数据的功能.首先说明一下,我的方法也不是官方的方法,只是自己灵机一动想到的,下面是动态增加列表项的方法. 在方

随机推荐