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(),
  ));
}
相关文章
|
26天前
|
存储 Shell 开发工具
Flutter&鸿蒙next 中使用 MobX 进行状态管理
本文介绍了如何在 Flutter 中使用 MobX 进行状态管理。MobX 是一个基于观察者模式的响应式编程库,通过 `@observable` 和 `@action` 注解管理状态,并使用 `Observer` 小部件自动更新 UI。文章详细讲解了 MobX 的核心概念、如何集成到 Flutter 项目中以及具体的代码示例。适合希望在 Flutter 应用中实现高效状态管理的开发者阅读。
92 9
|
26天前
|
开发工具 UED 容器
Flutter&鸿蒙next 实现长按录音按钮及动画特效
本文介绍了如何在 Flutter 中实现一个带有动画效果的长按录音按钮。通过使用 `GestureDetector` 监听长按手势,结合 `AnimatedContainer` 和 `AnimationController` 实现按钮的动画效果,以及 `flutter_sound` 插件完成录音功能。文章详细讲解了功能需求、实现思路和代码实现,帮助读者逐步掌握这一实用功能的开发方法。
98 5
|
26天前
|
存储 开发者
Flutter&鸿蒙next 使用 BLoC 模式进行状态管理详解
本文详细介绍了如何在 Flutter 中使用 BLoC 模式进行状态管理。BLoC 模式通过将业务逻辑与 UI 层分离,利用 Streams 和 Sinks 实现状态管理和 UI 更新,提高代码的可维护性和可测试性。文章涵盖了 BLoC 的基本概念、实现步骤及代码示例,包括定义 Event 和 State 类、创建 Bloc 类、提供 Bloc 实例以及通过 BlocBuilder 更新 UI。通过一个简单的计数器应用示例,展示了 BLoC 模式的具体应用和代码实现。
73 1
|
28天前
|
开发工具 开发者
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
本文深入探讨了 Flutter 中 Provider 的高级用法,涵盖多 Provider 组合、Selector 优化性能、ChangeNotifierProxyProvider 管理依赖关系以及自定义 Provider。通过这些技巧,开发者可以构建高效、可维护的响应式应用。
71 2
|
28天前
|
前端开发 开发者
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
本文深入探讨了 Flutter 中的绘图功能,重点介绍了 CustomPainter 和 Canvas 的使用方法。通过示例代码,详细讲解了如何绘制自定义图形、设置 Paint 对象的属性以及实现高级自定义动画。内容涵盖基本绘图、动画基础、渐变动画和路径动画,帮助读者掌握 Flutter 绘图与动画的核心技巧。
71 1
|
2月前
动画控制器在 Flutter 中的工作原理
【10月更文挑战第18天】总的来说,动画控制器 `AnimationController` 在 Flutter 中起着关键的作用,它通过控制动画的数值、速度、节奏和状态,实现了丰富多彩的动画效果。理解它的工作原理对于我们在 Flutter 中创建各种精彩的动画是非常重要的。
|
2月前
|
开发工具 开发者
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
|
26天前
|
缓存 JavaScript API
Flutter&鸿蒙next 状态管理框架对比分析
在 Flutter 开发中,状态管理至关重要,直接影响应用的性能和可维护性。本文对比分析了常见的状态管理框架,包括 setState()、InheritedWidget、Provider、Riverpod、Bloc 和 GetX,详细介绍了它们的优缺点及适用场景,并提供了 Provider 的示例代码。选择合适的状态管理框架需考虑应用复杂度、团队熟悉程度和性能要求。
87 0
|
2月前
【Flutter】状态管理:Provider状态管理
【Flutter】状态管理:Provider状态管理
22 0
|
4月前
|
前端开发
Flutter快速实现自定义折线图,支持数据改变过渡动画
Flutter快速实现自定义折线图,支持数据改变过渡动画
103 4
Flutter快速实现自定义折线图,支持数据改变过渡动画