首页 > 其他分享 >一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller

一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller

时间:2023-04-10 09:13:21浏览次数:53  
标签:widget 自定义 color controller 组件 flutter

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller

示例如下:

lib\state\controller.dart

/*
 * 状态管理 - 自定义 controller
 *
 * 为自定义组件指定一个自定义 controller 后,就可以在自定义组件的外部通过这个 controller 控制自定义组件或监听自定义组件
 */

import 'package:flutter/material.dart';

class ControllerDemo extends StatefulWidget {
  const ControllerDemo({Key? key}) : super(key: key);

  @override
  _ControllerDemoState createState() => _ControllerDemoState();
}

class _ControllerDemoState extends State<ControllerDemo> {

  final _controller = _MyWidgetController();
  var _color = Colors.transparent;

  @override
  void initState() {

    /// 通过 controller 监听自定义组件的变化
    _controller.addListener(() {
      setState(() {
        _color = _controller.color;
      });
    });

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SizedBox(
              height: 100,
              width: 100,
              child: _MyWidget(
                /// 创建自定义组价,并指定一个自定义 controller
                controller: _controller,
              ),
            ),
            const SizedBox(height: 10),
            Text("color: $_color"),
            const SizedBox(height: 10),
            ElevatedButton(
              /// 通过 controller 启动自定义组件中的动画
              onPressed: () => _controller.startAnimation(),
              child: const Text('启动'),
            )
          ],
        ),
      ),
    );
  }
}

/// 通过继承 ChangeNotifier 实现一个自定义 controller
class _MyWidgetController extends ChangeNotifier {

  Color color = Colors.transparent;
  bool shouldStartAnimation = false;

  void setColor(Color color) {
    this.color = color;
    notifyListeners();
  }

  void startAnimation() {
    this.shouldStartAnimation = true;
    notifyListeners();
  }
}

/// 自定义组件,为其指定一个自定义 controller 后,就可以在这个自定义组件的外部,通过这个 controller 控制自定义组件或监听自定义组件
/// 本例可以通过 controller 控制这个组件的动画的启动,以及监听这个动画的变化
class _MyWidget extends StatefulWidget {
  const _MyWidget({required this.controller, Key? key}) : super(key: key);
  final _MyWidgetController controller;

  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<_MyWidget> with SingleTickerProviderStateMixin {

  late AnimationController _animationController;
  late Animation<Color?> _colorAnimation;

  @override
  void initState() {

    _animationController = AnimationController(duration: const Duration(milliseconds: 3000), vsync: this);
    _colorAnimation = ColorTween(begin: Colors.red, end: Colors.blue).animate(_animationController)
      ..addListener(() {
        /// 动画发生变化时告知 controller,然后在组件的外部就可以通过 controller 监听到这个变化
        widget.controller.setColor(_colorAnimation.value!);
      });

    /// 如果组件的外部通过 controller 启动自定义组件中的动画,则这里就可以监听到这个动作
    widget.controller.addListener(() {
      if (widget.controller.shouldStartAnimation) {
        widget.controller.shouldStartAnimation = false;
        _animationController.reset();
        _animationController.forward();
      }
    });

    super.initState();
  }

  @override
  void dispose() {
    /// 清理 controller
    widget.controller.dispose();
    _animationController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return  AnimatedBuilder(
      animation: _colorAnimation,
      builder: (BuildContext context, Widget? widget) {
        return Container(
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: _colorAnimation.value,
          ),
        );
      },
    );
  }
}

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

标签:widget,自定义,color,controller,组件,flutter
From: https://www.cnblogs.com/webabcd/p/flutter_lib_state_controller.html

相关文章

  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 08.创建主HUD & 自定义作弊指令
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本篇文章对应课程Lecture14,56-58节。本篇文章将会教你将之前创建的各种UMG控件统合到一个主控件上。此外,还会教你如何在C++中创建自定义作弊指令,并在游戏中使用控制台执行它。目录创建主HUD使用GameMode生成玩......
  • controller随时取出登录用户信息的思路
    1.新建一个BaseController,里面写好公共方法,这些方法可以从springContextHoder取出当前线程绑定的请求信息,例如request和response,在这些方法里对request进行取出或者分析操作,例如header里的token。2.其他controller则继承BaseController,调用父类的方法,则可以随时取出当前登录用户......
  • JAVA实体类-自定义Getter Setter
    ###案例一整个购物车存放的商品信息需要计算的属性需要重写get方法,保证每次获取属性都会进行计算privateBigDecimaltotalPrice;/***计算当前购物项总价*@return*/publicBigDecimalgetTotalPrice(){//等于单价*数量returnthis.price.multiply(......
  • C# Linq俩个list<Datarow> 取差集,并自定义字段
    可以自定义类,也可以从参考官网文档:Enumerable.Except方法(System.Linq)|MicrosoftLearnList<DataRow>list1=newList<DataRow>();List<DataRow>list2=newList<DataRow>();DataTabledataTable=newDataTable();dataTable......
  • 小程序自定义组件 - 组件通信父传子
    页面组件化后,随即就面临组件间的通信问题,就组件间如何传递数据的问题.在vue中,总结下来就是父组件通过prop属性给子组件传简单的值,通过slot给子组件传dom等复杂数据;反之,子组件可通过$emit向父组件发射事件,然后在父组件中处理逻辑,达到子传父的效果.在小......
  • 3.自定义注解实现系统日志记载
    前言今天来分享一下我昨天的成果,昨天计划复现若依系统的系统日志记载功能,若依的系统日志记载的主要实现使用过自定义注解配合切面类来实现的,这里会把标注@Log的方法在用户调用完后,将方法的一部分信息记录在数据库的指定数据表中。因此我们需要java的spring开发四层结构:domain......
  • piix4_smbus : SMBus Host Controller not enabled,虚拟机无法启动
    昨晚准备开着虚拟机继续跑数据,结果发现虚拟机直接不开机了,显示piix4_smbus:SMBusHostControllernotenableddf-h,看各个分区的情况,/目录下占用率为100%,突然想起来在VMWARE内扩容并不会影响分区的大小,还需要进行分配,但现在肯定分配不了,直接开不了机了解决:重启虚拟机,长按shi......
  • GitHub Actions:从使用action操作到自定义action操作
    (目录)1、使用action操作文档https://docs.github.com/zh/actions/quickstart.github/workflows/github-actions-demo.ymlname:GitHubActionsDemorun-name:${{github.actor}}istestingoutGitHubActions......
  • ant-design-vue日历面板 a-calendar 属性自定义设置
    通过自定义属性设置,实现一个周末与工作日的不同颜色设置效果图: 使用的属性:自定义头部设置headerRender自定义日期显示dateFullCellRender代码:<template><divclass="box"><h3>1.自定义头部;2.自定义日期显示,工作日显示,周末显示</h3><a-c......
  • 小程序自定义组件 - 数据方法与属性
    这块在组件中的定义和使用,同vue是大致相同的.在小程序组件中定义在.js的Component()中即可.data和methods小程序中,组件数据要定义在data中,而事件处理函数和自定义方法都定义在methods中.以一个页面点击+1的例子作为演示:(还是之前的cj组件)组件......