Flutter

这里写自定义目录标题

  • Flutter
    • [1. 状态管理](#1. 状态管理)

Flutter

1. 状态管理

全局状态管理------------待补充(当应用中需要一些跨组件(包括跨路由)的状态需要同步时,上面介绍的方法便很难胜任了。比如,我们有一个设置页,里面可以设置应用的语言,我们为了让设置实时生效,我们期望在语言状态发生改变时,App中依赖应用语言的组件能够重新 build 一下,但这些依赖应用语言的组件和设置页并不在一起,所以这种情况用上面的方法很难管理。这时,正确的做法是通过一个全局状态管理器来处理这种相距较远的组件之间的通信)。

父Widget管理子Widget的状态:父组件负责"拥有"状态(即管理状态),而子组件负责"触发"状态变化。通过父组件传递回调函数,子组件可以"通知"父组件发生了什么变化,父组件通过 setState() 更新自己的状态并重新构建 UI。

dart 复制代码
// ParentWidget 为 TapboxB 管理状态.

//------------------------ ParentWidget --------------------------------

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class ParentWidget extends StatefulWidget {
  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  bool _active = false;

  void _handleTapboxChanged(bool newValue) {
    setState(() {
      _active = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: TapboxB(
        active: _active,
        onChanged: _handleTapboxChanged,
      ),
    );
  }
}

//------------------------- TapboxB ----------------------------------

class TapboxB extends StatelessWidget {
  TapboxB({Key? key, this.active = false, required this.onChanged})
      : super(key: key);

  final bool active;
  final ValueChanged<bool> onChanged;

  void _handleTap() {
    onChanged(!active);
  }

  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _handleTap,
      child: Container(
        child: Center(
          child: Text(
            active ? 'Active' : 'Inactive',
            style: TextStyle(fontSize: 32.0, color: Colors.white),
          ),
        ),
        width: 200.0,
        height: 200.0,
        decoration: BoxDecoration(
          color: active ? Colors.lightGreen[700] : Colors.grey[600],
        ),
      ),
    );
  }
}

用户点击 -> _handleTap -> 执行 onChanged(!active) ->子组件的 onChanged为父组件传递的_handleTapboxChanged回调 -> 执行_handleTapboxChanged方法,里面包含setState,就会更新UI。

整体来看:父组件控制子类的状态,通过定义setState来实现状态的变化,为了要控制子组件,父类传递给子类状态和回调(只是函数的名字,没有执行,只是传递),在子类中,当用户点击之后执行父类传递的回调函数(这里是函数名字+(参数),即执行方法),这个方法为setState,出发UI更新和状态变化。

相关推荐
python零基础入门小白13 小时前
2025年大模型面试通关秘籍!大厂高频LLMs真题全解析,一文掌握,助你轻松斩获心仪offer!
开发语言·人工智能·语言模型·架构·langchain·大模型教程·大模型面试
chenyuhao202413 小时前
MySQL事务
开发语言·数据库·c++·后端·mysql
g***789113 小时前
Java语法进阶
java·开发语言·jvm
灵犀坠13 小时前
前端核心知识体系梳理:从Vue 3到现代CSS与JavaScript
前端·javascript·vue.js
灰灰勇闯IT13 小时前
flutter环境配置中遇到的问题
flutter
白露与泡影13 小时前
Java面试题2025最新、最全、最细(附答案)
java·开发语言
renxhui13 小时前
Dart 速通攻略(面向 Android 工程师)
android·flutter·dart
幸运小圣13 小时前
递归(Recursion)快速上手指南【JS例子】
开发语言·javascript·ecmascript
宠..13 小时前
安装 Qt VS Tool 插件
开发语言·qt
我叫张小白。13 小时前
Vue3 基本生命周期:组件的一生之旅
前端·javascript·vue.js·前端框架·vue3