【发布时间】:2020-08-24 07:32:33
【问题描述】:
我正在自学 Flutter,之前学习过传统的面向对象语言。我仍然是初学者,但很明显状态管理是 Flutter 中的一个关键问题,所以我正在学习它(主要是使用 Providers)。
我正在学习的大部分内容似乎都是使用全局变量,从其他类设置和调用(在后一种情况下使用notifyListener() 调用)。但是当我了解 OOP 时,我被告知这是一件“坏”的事情。一个对象可能会无意中更改变量的值,从而破坏另一个对象。换句话说,封装是好的,全局变量是坏的——它们违反了封装的思想。
我错过了什么?
【问题讨论】:
-
不要认为你缺少任何东西。目前,Flutter 状态管理有点像一门黑暗的艺术,希望它在某个时候结晶。我使用 scoped_model ,因为我的应用程序是 12 个月前首次开发的,但由于 scoped_model 已被弃用,我将转向 Provider。我也使用全局变量,但通常它们是常量或仅在启动应用程序时设置一次(我还没有意识到单例)。
-
全局变量就是这样 - 全局的。当您使用提供者时,您正在使用依赖注入为小部件提供对可能是也可能不是全局的对象的引用(并且不应该是,因为这违背了提供者的目的)。就“打破封装”而言,情况并非如此,因为源正在通知目标其状态已更改,这反过来又会导致目标对象在必要时更新其自己的状态。这与一个对象直接改变另一个对象的属性不同,因为每个对象仍然负责自己的状态。
-
@GrahamD 在启动时设置一次的非常量全局值正是单例。
-
@Abion47 感谢您确认它的想法。赞赏。我认为我在单例语法/术语而不是概念上更加挣扎。希望能到达那里。
-
@GrahamD 单例没有单一的语法或实现(尽管约定它是作为具有静态
instance属性的类实现的)。严格来说,单例只是一个全局变量,它被赋值一次,然后在程序的生命周期中被多次引用。除此之外的一切都只是实现细节。
标签: flutter dart global-variables state-management