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;
  }
}
相关推荐
saoys13 分钟前
Opencv 学习笔记:创建与原图等尺寸的空白图像
笔记·opencv·学习
king王一帅2 小时前
Incremark Solid 版本上线:Vue/React/Svelte/Solid 四大框架,统一体验
前端·javascript·人工智能
晓幂6 小时前
【2025】HECTF
笔记·学习·web安全
慕云紫英7 小时前
基金申报的一点经验
学习·aigc
微露清风7 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
宝贝儿好7 小时前
【强化学习】第六章:无模型控制:在轨MC控制、在轨时序差分学习(Sarsa)、离轨学习(Q-learning)
人工智能·python·深度学习·学习·机器学习·机器人
大、男人7 小时前
python之asynccontextmanager学习
开发语言·python·学习
做cv的小昊7 小时前
【TJU】信息检索与分析课程笔记和练习(8)(9)发现系统和全文获取、专利与知识产权基本知识
大数据·笔记·学习·全文检索·信息检索
盐焗西兰花8 小时前
鸿蒙学习实战之路-蓝牙设置完全指南
学习·华为·harmonyos
hkNaruto8 小时前
【AI】AI学习笔记:MCP协议与gRPC、OpenAPI的差异
人工智能·笔记·学习