• 为什么不应该在 Flutter 中使用全局变量


    全局变量似乎是很棒的 Flutter 程序组件,因为它们被声明一次并且可以被程序中的每个函数访问。但是,这些变量的成本比您想象的要高,主要是因为:

    1. 如果删除一个全局变量,则必须搜索整个程序并重构每个有权访问已删除全局变量的函数

    2. 它们很难测试,因为您必须在测试用例之间重置它们

    3. 很难跟踪更改,因为每个函数都可以修改全局变量

    以上所有原因都说明了为什么在 Flutter 中永远不应该使用全局变量。在本教程中,我们将详细了解全局变量的缺点,并学习如何以更有效的方式管理状态。

    目录

    • Flutter 中的全局变量是什么?

    • Flutter 中使用全局变量的缺点

    • 如何以更好的方式管理状态

      • 提供者状态管理包

      • 获取X

      • 里弗波德

      • 还原

      • 设置状态方法

    Flutter 中的全局变量是什么?

    全局变量是公共变量,可以被 Flutter 程序中的每个方法和对象访问。

    全局变量是局部变量的替代品,它们在方法中创建并在该方法中访问。

    局部变量和全局变量之间的区别在于,局部变量不能被同一程序中的其他方法访问——因此,与全局变量相比,局部变量的作用域是有限的。

    Flutter 中使用全局变量的缺点

    在 Flutter 中使用全局变量一直受到质疑和批评,通常被认为是不好的做法。如何在Windows11中删除广告推送通知?window11如何屏蔽软件推送广告以下是使用全局变量的缺点:

    复杂的代码维护过程

    更改或删除一个全局变量会触发一系列事件,因为使用全局变量的小部件和方法将受到影响。

    如果要更改全局变量,则必须分析访问全局变量的每个小部件将如何受到影响并进行特定且必要的更改。

    如果删除一个全局变量,则必须搜索整个程序并重构每个有权访问已删除全局变量的函数。

    全局变量使单元测试变得痛苦

    如果您更改了一个具有全局变量的模块,那么您将不得不为下一次测试重置它。

    很难理解使用全局变量的遗留代码,而理解程序流程是如何工作的更是难上加难。微软云游戏服务仍处于起步阶段,离黄金时代还很遥远很难有效地测试你不理解的代码,调试也很困难,因为你不知道是谁改变了全局变量。

    全局变量导致意大利面条代码

    由于程序中的每个函数都可以修改全局变量,因此很难跟踪更改。如果你正在构建一个大型应用程序,在 Flutter 中使用全局变量的情况会升级。即使您正在构建小型 Flutter 应用程序,全局变量也是灾难的根源。

    全局变量反对封装

    全局变量使得无法实现封装,这是一种将代码包装到单个单元中的 OOP 概念。封装使得代码的维护变得安全和容易。如果你想有效地使用封装,你必须禁止全局变量。


    超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


    由于全局变量创建了意大利面条代码,因此需要大量的纪律来规范它们。但是,有些开发人员会使用全局变量,因为他们在一个小团队中,并且在某些情况下不利于更改。

    但是,无论应用程序的大小如何,当需要维护代码时,全局变量都会带来挑战。如何在 iPhone 上编辑视频,苹果手机如何编辑视频如果有必要使用全局变量,至少使它们不可变。

    在下一部分中,您将学习状态管理库和包,它们提供了以更好的方式管理变量状态而不影响维护过程的更好方法。

    如何以更好的方式管理状态

    Flutter 是一个跨平台的动态框架,用于收集和处理来自用户的数据。

    从开关到单选按钮,必须有效地管理数据状态。但是,全局变量会增加应用程序数据流的复杂性。全局变量使数据很容易发生变异,这可能会导致处理从用户那里收集的数据时出现混乱。

    诸如 之类的状态管理包provider可用于缓解全局变量带来的问题。以下是可用于管理状态的状态包管理器和库的列表:

    提供者状态管理包

    状态管理器provider包被广泛用于收集小部件状态数据并在状态变化时更新小部件。

    使用提供程序时,只有受影响的小部件会在数据发生突变时被更新。与随处变化的全局变量相比,提供程序降低了复杂性。提供者从小部件收集数据并监听小部件周围发生的数据变化。

    该包将应用程序状态与 UI 分离,并provider促进应用程序的维护和测试。


    来自 LogRocket 的更多精彩文章:

    • 不要错过来自 LogRocket 的精选时事通讯The Replay

    • 了解LogRocket 的 Galileo 如何消除噪音以主动解决应用程序中的问题

    • 使用 React 的 useEffect优化应用程序的性能

    • 在多个 Node 版本之间切换

    • 了解如何使用 AnimXYZ 为您的 React 应用程序制作动画

    • 探索 Tauri,一个用于构建二进制文件的新框架

    • 比较NestJS 与 Express.js


    使用以下代码片段添加和使用provider包插件:

    dependencies:
      flutter:
        sdk: flutter
    ​
      provider: ^3.1.0

    该provider包还允许您与多个类共享小部件状态:

    void main() {
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (context) => CartModel()),
            Provider(create: (context) => SomeOtherClass()),
          ],
          child: const MyApp(),
        ),
      );
    }

    获取X

    GetX是一个轻量级的 Flutter 库,它提高了可扩展性,因为它允许您解耦视图、依赖注入、表示层和依赖注入。

    它提供以下功能:

    • 状态管理

    • 依赖注入

    • 导航

    • 路线管理

    如果您正在寻找节省资源且消耗最少的库,GetX 是您的最佳选择。

    要在 Flutter 应用程序启动中开始使用 GetX,请get在 pubspec.yaml 文件中添加:

    dependencies:
      get:

    接下来,导入get使用 GetX 库函数和组件时需要的文件:

    import 'package:get/get.dart';

    里弗波德

    Riverpod项目与包类似——provider唯一的区别是它以单向方式分发数据。

    此状态管理器确保您的代码可测试且易于阅读,因为它消除了用于组合对象的嵌套。特殊功能是它在编译过程中检测错误。这将节省您的时间,因为您将在运行时将缺陷添加到您的应用程序之前修复错误。

    还原

    Redux是一个库,可帮助您有效地管理小部件的数据状态。Redux 是一种以单向方式跨小部件执行状态数据分布的架构。该库很棒,因为它消除了状态重复,您可以测试状态结果是否为真。

    SetState方法_

    之前,我们只介绍了管理状态的 Flutter 包和库。

    setState 当您的小部件更改数据值时,可以调用一个方法。它将导致 UI 根据新状态发生变化。您可以添加在状态更改时执行某些操作的代码。下面是setStateFlutter 中的一个基本实现:

    class _MyHomePageState extends State {
      int _counter = 0;
    ​
      void _incrementCounter() {
        _counter++;
        setState(() {});
      }

    结论

    在本教程中,我们详细了解了全局变量是什么以及为什么我们不应该在 Flutter 中使用它们。此外,我们还探索了可用于更有效地管理状态的各种状态管理库。

  • 相关阅读:
    Linux知识点总结(文件,进程,进程间通信)
    Docker学习(4)—— 容器数据卷
    AdaInf: Data Drift Adaptive Scheduling 阅读笔记
    C++11的std::function和bind绑定器
    Android:代码混淆概念整理
    提升程序运行速度-计算加速的20种方法
    程序员朴实无华的一天都做些什么?
    第 1 章 概述 习题
    零基础html学习/刷题-第二期
    【数据结构初阶】复杂链表复制+带头双向循环链表+缓存级知识
  • 原文地址:https://blog.csdn.net/weixin_47967031/article/details/127451987