flutter的状态管理学习

文章目录

        • [1.flutter widget分类](#1.flutter widget分类)
        • [2. 代理组件又分为](#2. 代理组件又分为)
        • [3. 状态 state 数据](#3. 状态 state 数据)
        • [4. 刷新 数据变化](#4. 刷新 数据变化)
        • [5. code](#5. code)
1.flutter widget分类
  1. 组合
  2. 渲染
  3. 代理
2. 代理组件又分为
  1. Positioned向父组件传递数据
  2. InheritedWidget向子组件传递数据
3. 状态 state 数据

状态就是用到了向子组件传递数据,并且需要刷新的时候刷新组件

4. 刷新 数据变化
  1. 获取并在改变的时候会导致刷新
    dependOnInheritedWidgetOfExactType
  2. 只获取不会因为数据变化导致刷新
    getInheritedWidgetOfExactType
5. code
dart 复制代码
import 'package:flutter/material.dart';

//material cupertino
//widget
//rendering
//foundation 动画 事件 painting
//flutter框架层
//engine
//embedded嵌入式

main() {
  runApp(const MaterialApp(
    home: StateStudyPage(),
  ));
}

class StateStudyPage extends StatefulWidget {
  const StateStudyPage({super.key});

  @override
  State<StateStudyPage> createState() => _StateStudyPageState();
}

class _StateStudyPageState extends State<StateStudyPage> {
  int aa = 0;

  int dt1 = 0;
  int dt2 = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ShareData2Widget(
        dt1: dt1,
        dt2: dt2,
        child: Column(
          children: [
            Text("parent=$aa"),
            TextButton(
                onPressed: () {
                  setState(() {
                    aa++;
                  });
                },
                child: Text("刷新当前state")),
            TextButton(
                onPressed: () {
                  setState(() {
                    dt1++;
                  });
                },
                child: Text("刷新当前state dt1=$dt1")),
            TextButton(
                onPressed: () {
                  setState(() {
                    dt2++;
                  });
                },
                child: Text("刷新当前state dt2=$dt2")),
            StateStudyChildPage(
              aa: aa,
            ),
          ],
        ),
      ),
    );
  }
}

class StateStudyChildPage extends StatefulWidget {
  final int aa;

  const StateStudyChildPage({super.key, required this.aa});

  @override
  State<StateStudyChildPage> createState() => _StateStudyChildPageState();
}

class _StateStudyChildPageState extends State<StateStudyChildPage> {
  int a = 0;

  ///由于父widget setState 导致该方法调用
  @override
  void didUpdateWidget(covariant StateStudyChildPage oldWidget) {
    super.didUpdateWidget(oldWidget);
    print("更新widget");
  }

  ///由于用到了共享数据,并在数据变化的时候调用了父组件的setState,导致该方法调用
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("依赖变化");
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("child=$a"),
        Text("child==aa=${widget.aa}"),
        Text("child==cc=${ShareData2Widget.of(context, "data")?.dt1}"),
        TextButton(
            onPressed: () {
              setState(() {
                a++;
              });
            },
            child: Text("刷新当前state"))
      ],
    );
  }
}

///整体数据刷新
class ShareDataWidget extends InheritedWidget {
  const ShareDataWidget({
    super.key,
    required this.data,
    required super.child,
  });

  final int data; //需要在子树中共享的数据,保存点击次数

  //定义一个便捷方法,方便子树中的widget获取共享数据
  static ShareDataWidget? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<ShareDataWidget>();
  }

  //该回调决定当data发生变化时,是否通知子树中依赖data的Widget重新build
  @override
  bool updateShouldNotify(ShareDataWidget oldWidget) {
    return oldWidget.data != data;
  }
}

///局部数据导致刷新
class ShareData2Widget extends InheritedModel<String> {
  const ShareData2Widget({
    super.key,
    required this.dt2,
    required this.dt1,
    required super.child,
  });

  final int dt1;
  final int dt2;

  //定义一个便捷方法,方便子树中的widget获取共享数据
  //type就是根据type来判断是否需要刷新组件
  static ShareData2Widget? of(BuildContext context, String type) {
    return context.dependOnInheritedWidgetOfExactType<ShareData2Widget>(
        aspect: type);
  }

  //该回调决定当data发生变化时,是否通知子树中依赖data的Widget重新build
  @override
  bool updateShouldNotify(ShareData2Widget oldWidget) {
    print("oldWidget.dt1 != dt1=${oldWidget.dt1 != dt1}");
    return oldWidget.dt1 != dt1 || oldWidget.dt2 != dt2;
  }

  @override
  bool updateShouldNotifyDependent(
      covariant ShareData2Widget oldWidget, Set<String> dependencies) {
    return dependencies.contains("data") && oldWidget.dt1 != dt1 ||
        dependencies.contains("data2") && oldWidget.dt2 != dt2;
  }
}
相关推荐
sunbyte1 小时前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleVerticalSlider(双垂直滑块)
前端·javascript·css·vue.js·vue
fen_fen1 小时前
学习笔记(32):matplotlib绘制简单图表-数据分布图
笔记·学习·matplotlib
爱学习的茄子2 小时前
JavaScript事件循环深度解析:理解异步执行的本质
前端·javascript·面试
1024小神2 小时前
cocos游戏开发中多角色碰撞,物理反弹后改变方向的实现逻辑
前端·javascript
ruanhongbiao2 小时前
饿了么el-upload上传组件报错:TypeError: ***.upload.addEventListener is not a function
javascript·elementui
_一两风2 小时前
JS执行机制-event loop
javascript
止观止2 小时前
JavaScript对象创建9大核心技术解析
开发语言·javascript·ecmascript
1024小神2 小时前
cocos游戏开发中,如何制作一个空气墙
前端·javascript
爱编程的喵2 小时前
深入理解JavaScript事件循环机制:从同步到异步的完整解析
前端·javascript
20262 小时前
11. vite打包优化
前端·javascript·vite