flutter:动画&状态管理 (十三)

简介: 本文档介绍了Flutter中`animatedList`的使用方法和状态管理的示例。`animatedList`用于创建带有动画效果的列表,示例代码展示了如何添加、删除列表项,并执行相应的动画效果。状态管理部分通过一个简单的点击切换颜色的示例,演示了如何在Flutter中管理组件的状态。

前言

在构建现代用户界面的应用中,流畅的动画和有效的状态管理是提升用户体验的重要因素。Flutter提供了强大的工具来实现这些功能,其中AnimatedList是一个用于创建带有动画效果的动态列表的组件。本文档将详细介绍AnimatedList的使用方法,并通过示例代码展示如何添加和删除列表项,同时实现相应的动画效果。

此外,状态管理在Flutter中也至关重要,能够帮助我们在用户交互时保持界面的响应性和一致性。本文还将提供一个简单的示例,演示如何通过点击事件切换组件的颜色,展现Flutter中状态管理的基本思路。

动画

animatedList

bool flag = true;
  final _globalkey = GlobalKey<AnimatedListState>();
  List<String> list = ["第一条", "第二条"];
  Widget _buildItem(index) {
    return ListTile(
      key: ValueKey(index),
      trailing: IconButton(
        icon: Icon(Icons.delete),
        onPressed: () {
          //  调用 删除
          _deleteItem(index);
        },
      ),
      title: Text(list[index]),
    );
// 删除 方法
  _deleteItem(index) {
    if (flag) {
      flag = false;
      //    通过 全局 变量 来 操作
      _globalkey.currentState!.removeItem(index, (context, animation) {
        var removeItem = _buildItem(index);
        list.removeAt(index);
        //  执行 动画
        return FadeTransition(
          opacity: animation,
          // 执行 动画 的元素
          child: removeItem,
        );
      });
    }
Timer.periodic(Duration(milliseconds: 500), (timer) {
      //  当 为 false  时  无法 删除
      flag = true;
      timer.cancel();
    });
@override
  Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            setState(() {
              list.add("我是新增的数据");
              //  向后 加 值
              _globalkey.currentState!.insertItem(list.length - 1);
            });
          },
        ),
        appBar: AppBar(
          title: Text("title"),
        ),
        body: AnimatedList(
          key: _globalkey,
          //  初始化 的 长度 为  list.length
          initialItemCount: list.length,
          itemBuilder:
              (BuildContext context, int index, Animation<double> animation) {
            return FadeTransition(
              opacity: animation,
              child: _buildItem(index),
            );
          },
        ));
  }
import 'dart:async';
import 'package:flutter/material.dart';
class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: test(),
    );
  }
}
class test extends StatefulWidget {
  const test({Key? key}) : super(key: key);
  @override
  State<test> createState() => _testState();
}
class _testState extends State<test> {
  //  防抖
  bool flag = true;
  final _globalkey = GlobalKey<AnimatedListState>();
  List<String> list = ["第一条", "第二条"];
  Widget _buildItem(index) {
    return ListTile(
      key: ValueKey(index),
      trailing: IconButton(
        icon: Icon(Icons.delete),
        onPressed: () {
          //  调用 删除
          _deleteItem(index);
        },
      ),
      title: Text(list[index]),
    );
  }
  // 删除 方法
  _deleteItem(index) {
    if (flag) {
      flag = false;
      //    通过 全局 变量 来 操作
      _globalkey.currentState!.removeItem(index, (context, animation) {
        var removeItem = _buildItem(index);
        list.removeAt(index);
        //  执行 动画
        return FadeTransition(
          opacity: animation,
          // 执行 动画 的元素
          child: removeItem,
        );
      });
    }
    Timer.periodic(Duration(milliseconds: 500), (timer) {
      //  当 为 false  时  无法 删除
      flag = true;
      timer.cancel();
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            setState(() {
              list.add("我是新增的数据");
              //  向后 加 值
              _globalkey.currentState!.insertItem(list.length - 1);
            });
          },
        ),
        appBar: AppBar(
          title: Text("title"),
        ),
        body: AnimatedList(
          key: _globalkey,
          //  初始化 的 长度 为  list.length
          initialItemCount: list.length,
          itemBuilder:
              (BuildContext context, int index, Animation<double> animation) {
            return FadeTransition(
              opacity: animation,
              child: _buildItem(index),
            );
          },
        ));
  }
}
void main() {
  runApp(const MyApp());
}

状态管理

一个简单的Flutter应用,其中定义了一个状态管理的组件TapBoxA。该组件使用StatefulWidget来管理其内部状态,通过GestureDetector检测用户的点击操作。当用户点击方块时,_active状态会在true和false之间切换,从而改变方块的背景颜色:如果处于激活状态,方块的颜色为灰色;否则为浅绿色。同时,方块中间显示了文本“active”。该应用通过main函数运行,展示了如何在Flutter中创建交互式组件并管理其状态。

import 'package:flutter/material.dart';
class TapBoxA extends StatefulWidget{
  const TapBoxA({super.key});
  @override
  State<StatefulWidget> createState() =>_TapBoxAState();
}
class _TapBoxAState extends State<TapBoxA>{
  bool _active=false;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (()=>
        setState(()=> _active = !_active)),
      child: Container(
        width: 200,
        height: 200,
        decoration: const BoxDecoration(
          // color: Colors.grey,
      color: _active ? Colors.grey : Colors.lightGreen,
        ),
        child: const Center(
          child: Text(
          // _active?'Active':'InActive',
            'active',
            style: TextStyle(fontSize: 32,color:Colors.white,),),
        ),
      ),
    );
  }
}
void main(List<String> args){
  runApp(const MaterialApp(
    title: 'myApp',
    home:TapBoxA(),
  ));
}
相关文章
|
存储 Dart 数据库
重识Flutter状态管理 — 探索Flutter中的状态
我遇到过很多没有了解过响应式编程框架的,或者从事后端开发,自己想用Flutter写个app玩玩的朋友,一上来,不管在哪里都用`setState`,我问为啥不用状态管理,大部分都回了一句:啥是状态管理?
|
3月前
flutter的状态管理学习
flutter的状态管理学习
|
5月前
|
Dart
Flutter状态管理:RxDart,详细介绍
Flutter状态管理:RxDart,详细介绍 RxDart是一个基于Dart语言的响应式编程库,它提供了一套用于处理异步事件序列的工具。在Flutter应用中,RxDart可以很好地用于管理应用状态。
268 0
|
5月前
|
开发框架 API 开发者
Flutter的动画:实现方式与动画库的技术探索
【4月更文挑战第26天】探索Flutter动画机制与库:基础动画、自定义动画、物理动画及Lottie、AnimatedWidgets、EasyAnimations等库的应用,助开发者实现丰富动画效果,提升用户体验。同时,了解性能优化技巧,如避免重绘、利用离屏渲染和GPU加速,确保动画流畅。 Flutter为移动应用开发带来强大动画支持。
|
5月前
|
编解码 缓存 调度
Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理
Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理
237 0
|
5月前
|
开发者
Flutter状态管理终极方案GetX第二篇——状态管理
Flutter状态管理终极方案GetX第二篇——状态管理 在Flutter应用程序中,状态管理是必不可少的。GetX提供了简单易用的状态管理方案,使得开发者可以更加轻松地管理应用程序状态。下面介绍GetX中的状态管理方案。
233 0
Flutter常用的滚动组建及其优化
Flutter 常用的滚动组件包括:1. ListView:在一个可滚动的列表中显示一系列的子控件。2. GridView:在一个网格布局中显示一系列的子控件。3. SingleChildScrollView:在一个可滚动的视图中显示单个子控件。4. CustomScrollView:自定义滚动模型的可滚动视图,可以同时包含多种滚动模型,如 ListView、GridView 和 SliverAppBar 等。
Flutter常用的滚动组建及其优化
Flutter常用的状态管理介绍
Flutter中常用的状态管理方案主要有以下几种。
Flutter常用的状态管理介绍
|
容器
Flutter | 布局流程(下)
Flutter | 布局流程(下)
Flutter | 布局流程(下)
|
Java Android开发
Flutter(八)——状态管理(二)
Flutter(八)——状态管理(二)
273 0
Flutter(八)——状态管理(二)