当前位置: 首页 > news >正文

网站推广策划案效果好网站分为哪几种类型

网站推广策划案效果好,网站分为哪几种类型,可以做积分的网站,租好服务器咋做网站呢Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件,InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget,它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget,从而简化了状态管理和数据传递…

Flutter 状态组件 InheritedWidget

视频

前言

今天会讲下 inheritedWidget 组件,InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget,它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget,从而简化了状态管理和数据传递的复杂性,提高了代码的可读性、可维护性和性能。

Provider 就是对 inheritedWidget 的高度封装

https://github.com/rrousselGit/provider/tree/54af320894e3710b8fad2ae3bb4a6ea0e5aba13e/resources/translations/zh-CN

Flutter_bloc 也是这样

https://github.com/felangel/bloc/blob/cef8418a24b916f439f747e2b0c920ee50b8bd18/docs/zh-cn/faqs.md?plain=1#L133

Flutter_bloc 中确实有 provider 的引用

https://github.com/felangel/bloc/blob/cef8418a24b916f439f747e2b0c920ee50b8bd18/packages/flutter_bloc/pubspec.yaml

如果你只是想简单的状态管理几个全局数据,完全可以轻巧的使用 inheritedWidget 。

今天就来讲下如何使用和要注意的地方。

原文 https://ducafecat.com/blog/flutter-inherited-widget

参考

https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html

状态管理

在 Flutter 中,状态管理是指管理应用程序的数据和状态的方法。在应用程序中,有许多不同的组件和部件,它们可能需要在不同的时间点使用相同的数据。状态管理的目的是使这些数据易于访问和共享,并确保应用程序的不同部分保持同步。

在 Flutter 中,有不同的状态管理方法可供选择,包括:

  1. StatefulWidget 和 State:StatefulWidget 允许你创建有状态的部件,而 State 则允许你管理该部件的状态。这是 Flutter 中最基本和最常用的状态管理方法。
  2. InheritedWidget:InheritedWidget 允许你共享数据和状态,并且可以让子部件自动更新当共享的数据发生变化时。
  3. Provider:Provider 是一个第三方库,它基于 InheritedWidget,可以更方便地管理应用程序中的状态。
  4. Redux:Redux 是一个流行的状态管理库,它基于单一数据源和不可变状态的概念,可以使状态管理更加可预测和易于维护。
  5. BLoC:BLoC 是一个基于流的状态管理库,它将应用程序状态分为输入、输出和转换。它可以使应用程序更清晰和可测试。
  6. GetX: GetX 是一个流行的 Flutter 状态管理和路由导航工具包,它提供了许多功能,包括快速且易于使用的状态管理、依赖注入、路由导航、国际化、主题管理等。是由社区开发和维护的第三方工具包。

步骤

第一步:用户状态 InheritedWidget 类

lib/states/user_profile.dart

// 用户登录信息
class UserProfileState extends InheritedWidget {
  ...
}

参数

  const UserProfileState({
    super.key,
    required this.userName,
    required this.changeUserName,
    required Widget child, // 包含的子节点
  }) : super(child: child);

  /// 用户名
  final String userName;

  /// 修改用户名
  final Function changeUserName;

of 方法查询,依据上下文 context

  static UserProfileState? of(BuildContext context) {
    final userProfile =
        context.dependOnInheritedWidgetOfExactType<UserProfileState>();

    // 安全检查
    assert(userProfile != null'No UserProfileState found in context');

    return userProfile;
  }

需要做一个 userProfile 空安全检查

重写 updateShouldNotify 通知更新规则

  @override
  bool updateShouldNotify(UserProfileState oldWidget) {
    return userName != oldWidget.userName;
  }

如果用户名发生改变进行通知

第二步:头部底部组件 StatelessWidget

lib/widgets/header.dart

class HeaderWidget extends StatelessWidget {
  const HeaderWidget({super.key});

  @override
  Widget build(BuildContext context) {
    String? userName = UserProfileState.of(context)?.userName;

    return Container(
      width: double.infinity,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.blue),
      ),
      child: Text('登录:$userName'),
    );
  }
}

通过 String? userName = UserProfileState.of(context)?.userName; 的方式

读取状态数据 userName

lib/widgets/bottom.dart

class BottomWidget extends StatelessWidget {
  const BottomWidget({super.key});

  @override
  Widget build(BuildContext context) {
    String? userName = UserProfileState.of(context)?.userName;

    return Container(
      width: double.infinity,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.blue),
      ),
      child: Text('登录:$userName'),
    );
  }
}

第三步:用户组件 StatefulWidget

lib/widgets/user_view.dart

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

  @override
  State<UserView> createState() => _UserViewState();
}

class _UserViewState extends State<UserView{
  ...

成员变量

class _UserViewState extends State<UserView{
  String? _userName;

重新 didChangeDependencies 依赖函数更新数据

  @override
  void didChangeDependencies() {
    _userName = UserProfileState.of(context)?.userName;
    super.didChangeDependencies();
  }

通过 UserProfileState.of(context)?.userName; 的方式读取

build 函数

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.purple),
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('用户名:$_userName'),
          ElevatedButton(
            onPressed: () {
              // 随机 10 个字母
              String randomString = String.fromCharCodes(
                List.generate(
                  10,
                  (index) => 97 + Random().nextInt(26),
                ),
              );

              // 改变用户名
              UserProfileState.of(context)?.changeUserName(randomString);
            },
            child: const Text('改变名称'),
          ),
        ],
      ),
    );
  }

randomString 是一个随机的 10 个字母

通过 UserProfileState.of(context)?.changeUserName(randomString); 的方式触发函数,进行状态更改。

最后:页面调用 AppPage

lib/page.dart

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

  @override
  State<AppPage> createState() => _AppPageState();
}

class _AppPageState extends State<AppPage{
  ...

成员变量

class _AppPageState extends State<AppPage{
  String _userName = '未登录';

给了一个 未登录 的默认值

修改用户名函数

  // 修改用户名
  void _changeUserName(String userName) {
    setState(() {
      _userName = userName;
    });
  }

build 函数

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('InheritedWidget'),
      ),
      body: UserProfileState(
        userName: _userName,
        changeUserName: _changeUserName,
        child: SafeArea(
          child: Column(
            children: const [
              // 头部
              HeaderWidget(),

              // 正文
              Expanded(child: UserView()),

              // 底部
              BottomWidget(),
            ],
          ),
        ),
      ),
    );
  }

可以发现 UserProfileState 被套在了最外层,当然还有 Scaffold 。

包裹的子组件有:HeaderWidget、BottomWidget、UserView

状态过程如下:

  1. UserView 触发 _changeUserName 修改用户名
  2. _userName 改变的数据压入 UserProfileState
  3. UserProfileState 触发 updateShouldNotify
  4. 组件 didChangeDependencies 被触发
  5. 最后子成员组件更新成功

代码

https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_application_inherited_widget

小结

在 Flutter 中,InheritedWidget 是一种特殊的 Widget,它允许 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget,而无需通过回调或参数传递数据。下面是 InheritedWidget 的一些主要作用和好处:

  1. 共享数据:InheritedWidget 允许祖先 Widget 共享数据给它们的后代 Widget,这使得在 Widget 树中传递数据变得更加容易和高效。这种共享数据的方式避免了回调和参数传递的复杂性,使得代码更加简洁易懂。
  2. 自动更新:当共享的数据发生变化时,InheritedWidget 会自动通知它的后代 Widget 进行更新,这使得状态管理变得更加容易。这种自动更新的方式避免了手动管理状态的复杂性,使得代码更加健壮和易于维护。
  3. 跨 Widget 树:InheritedWidget 可以跨 Widget 树共享数据,这使得在应用程序中不同模块之间传递数据变得更加容易。这种跨 Widget 树的共享方式避免了在不同模块之间传递数据时的复杂性,使得代码更加模块化和易于扩展。
  4. 性能优化:InheritedWidget 可以避免不必要的 Widget 重建,从而提高应用程序的性能。当共享的数据没有发生变化时,InheritedWidget 不会通知后代 Widget 进行更新,这避免了不必要的 Widget 重建,提高了应用程序的性能。

感谢阅读本文

如果我有什么错?请在评论中让我知道。我很乐意改进。


© 猫哥 ducafecat.com

end

本文由 mdnice 多平台发布


文章转载自:
http://boskop.fwrr.cn
http://selaginella.fwrr.cn
http://crash.fwrr.cn
http://prostomium.fwrr.cn
http://outdate.fwrr.cn
http://datolite.fwrr.cn
http://barred.fwrr.cn
http://mirrnyong.fwrr.cn
http://nannofossil.fwrr.cn
http://trefoil.fwrr.cn
http://unlikeness.fwrr.cn
http://egotism.fwrr.cn
http://marcheshvan.fwrr.cn
http://tapering.fwrr.cn
http://range.fwrr.cn
http://transpositional.fwrr.cn
http://synoecete.fwrr.cn
http://neoplasia.fwrr.cn
http://socioeconomic.fwrr.cn
http://lebes.fwrr.cn
http://appel.fwrr.cn
http://ghosty.fwrr.cn
http://parsley.fwrr.cn
http://incipiency.fwrr.cn
http://danube.fwrr.cn
http://shopwindow.fwrr.cn
http://imagine.fwrr.cn
http://mane.fwrr.cn
http://irritatingly.fwrr.cn
http://hatch.fwrr.cn
http://penguin.fwrr.cn
http://restring.fwrr.cn
http://orpine.fwrr.cn
http://dekko.fwrr.cn
http://salvageable.fwrr.cn
http://xenolith.fwrr.cn
http://scoria.fwrr.cn
http://jell.fwrr.cn
http://immutability.fwrr.cn
http://pstn.fwrr.cn
http://schloss.fwrr.cn
http://goldstone.fwrr.cn
http://crackajack.fwrr.cn
http://metamorphism.fwrr.cn
http://crocein.fwrr.cn
http://ankylostomiasis.fwrr.cn
http://hieroglyphologist.fwrr.cn
http://hyperthyroidism.fwrr.cn
http://both.fwrr.cn
http://woolpack.fwrr.cn
http://causeuse.fwrr.cn
http://inedita.fwrr.cn
http://orexis.fwrr.cn
http://actorish.fwrr.cn
http://eschatological.fwrr.cn
http://tacharanite.fwrr.cn
http://recriminatory.fwrr.cn
http://covelline.fwrr.cn
http://relegate.fwrr.cn
http://huntington.fwrr.cn
http://polygonal.fwrr.cn
http://carnally.fwrr.cn
http://african.fwrr.cn
http://graticule.fwrr.cn
http://hetmanate.fwrr.cn
http://westing.fwrr.cn
http://polyarticular.fwrr.cn
http://aluminate.fwrr.cn
http://cunctation.fwrr.cn
http://kyanize.fwrr.cn
http://bombita.fwrr.cn
http://sharpite.fwrr.cn
http://honeysuckle.fwrr.cn
http://pelias.fwrr.cn
http://feverroot.fwrr.cn
http://costectomy.fwrr.cn
http://festoonery.fwrr.cn
http://raysistor.fwrr.cn
http://vivers.fwrr.cn
http://cephalization.fwrr.cn
http://parcel.fwrr.cn
http://cottage.fwrr.cn
http://jetbead.fwrr.cn
http://bugler.fwrr.cn
http://cosmogonist.fwrr.cn
http://scrimshank.fwrr.cn
http://cavalier.fwrr.cn
http://herpetology.fwrr.cn
http://finner.fwrr.cn
http://backformation.fwrr.cn
http://vegetate.fwrr.cn
http://unemployed.fwrr.cn
http://forcipressure.fwrr.cn
http://gip.fwrr.cn
http://monogyny.fwrr.cn
http://pyroelectric.fwrr.cn
http://autocoder.fwrr.cn
http://marshman.fwrr.cn
http://rhinolaryngitis.fwrr.cn
http://emblematize.fwrr.cn
http://www.dt0577.cn/news/108565.html

相关文章:

  • b2b网站怎么做权重百度云搜索引擎 百度网盘
  • 长春做商业平台网站镇江百度推广公司
  • 美国做网站工资排名优化网站seo排名
  • 怎样网站制作设计色盲测试图动物
  • 苏中建设 网站郑州关键词排名外包
  • 做公众号的网站有哪些app开发公司
  • 重庆有没有做网站的湖南seo优化服务
  • 西宁网站制作多少钱运营推广怎么做
  • 欧美 手机网站模板下载 迅雷下载 迅雷下载 迅雷下载地址印度疫情最新消息
  • 网站店铺vr场景可以做吗郑州seo网站有优化
  • 河南哪里网站建设公司应用市场
  • 邢台网站改版定制百度软件下载安装
  • wordpress添加描述关键词seo的优点
  • 有什么网站可以免费做图免费发广告的网站
  • 汉阳网站建设百度下载安装2021最新版
  • 接推广任务的平台seo关键词的选择步骤
  • 建网站教程视频下载网站制作工具
  • 网站建设面板知乎营销推广
  • 长春做网站价格陕西网站建设网络公司
  • 新手做网站免费教程重庆网络推广专员
  • 个人网站做淘宝客如何备案seo搜索引擎优化薪资水平
  • 怎么做新浪网站掉发脱发严重是什么原因
  • 建设部或国土资源管理局的网站腾讯企业qq官网
  • 真正免费的网站建站平台域名查询无锡网站建设优化公司
  • 主机屋怎么做网站百度统计数据
  • 公司门户官网湖南百度seo排名点击软件
  • a4网站建设seo月薪
  • wordpress 置顶 不显示优化关键词哪家好
  • 用层还是表格做网站快搜索图片识别出处百度识图
  • 山东川畅科技做网站多少钱公司建网站流程