Kau*_*iya 3 dart flutter flutter-dependencies
我正在使用 ChangeNotifier,我更改它们的值并通知如下,
// Declare
ValueNotifier<bool> isDisplay = new ValueNotifier(false);
// Change value
isDisplay.value = false;
isDisplay.notifyListeners();
Run Code Online (Sandbox Code Playgroud)
我们可以使用正确的实施或其他方法来解决这个问题吗?
我也遇到了这些错误,更具体地说,是这两个错误:
\nThe member \'notifyListeners\' can only be used within instance members of subclasses of \'package:flutter/src/foundation/change_notifier.dart\'.dart(invalid_use_of_protected_member)\nThe member \'notifyListeners\' can only be used within \'package:flutter/src/foundation/change_notifier.dart\' or a test.dart(invalid_use_of_visible_for_testing_member)\n
Run Code Online (Sandbox Code Playgroud)\n经过一番研究后,我得出了一些结论和解决方案。我想我应该与遇到这个问题的人分享。
\n它实际上说的很明显,\xe2\x80\x9c如果你想调用notifyListeners()
,你必须在 ChangeNotifier 的子类或测试文件\xe2\x80\x9d 中执行它
\xe2\x80\x9c 但这是为什么呢?\xe2\x80\x9d 可以理解,这是我的第二个问题。但在此之前,先了解一下notifyListeners 方法到底来自哪里
\n如果你看一下 ValueNotifier 的实现,它扩展了 ChangeNotifier 类:
\n\n\n\n
ChangeNotifier 有一个notifyListeners()
方法(这就是为什么我们首先可以使用这个方法),但不是以通常的方式:
\n\n\n
它受到保护。
\n\n\n[
\n@protected
annotation] 表示类或 mixin C 中的带注释的实例成员(方法、getter、setter、运算符或字段)m 只能在特定位置引用。来自声明 C 的库内的引用是有效的。此外,来自 C 中实例成员的引用,或者在 C 中扩展、实现或混合(直接或间接)的类,或者使用 C 作为超类约束的 mixin都是有效的。此外,来自适用于 C 的扩展中的实例成员内部的引用是有效的。\xe2\x80\x9d
\n
更通俗的解释是:它可以在直接扩展(或混合)类的子类中或在测试文件中使用ChangeNotifier
。由于您想在逻辑代码中使用它,因此您必须执行本段中的第一部分: \xe2\x80\x9cextend 或在您要调用的位置混合 ChangeNotifiernotifyListeners
方法的地方混合 ChangeNotifier。\xe2\x80\x9d
您可能会想在有状态或无状态小部件中使用它,并且由于 Dart 是单继承,因此您必须将 \xe2\x80\x9cmixin\xe2\x80\x9d ChangeNotifier 类添加到您的类中,但是您那就错了。
\nChangeNotifier 类定义了自己的dispose
方法。由于混合到您的类中的类或 mixin取代了以前继承的方法,因此通过查看 ChangeNotifier 的方法,您会注意到该dispose
方法(用于删除侦听器)。因此,如果您将 ChangeNotifier 与 StatefulWidget 混合,那么现在您dispose
将是 ChangeNotifierdispose
而不是 State dispose
。
请记住,无论如何,您都必须释放 State 类使用的资源。通常,如果您不重写dispose
State 中的方法,框架会为您执行此操作并自行释放资源,这很酷;但由于您刚刚更改了 dispose 方法的祖先,框架将不会触发所需的 dispose 方法。这将引发运行时错误。
在 StatelessWidget 的情况下,现在您的小部件将有一个来自混合 ChangeNotifier 的_listener
非最终实例变量。因此,您无法定义 const 构造函数,这是 StatelessWidget 最重要的部分(谈论 widget 重建和性能相关情况)。
最后,解决方案是创建一个新类来操作值更改并将ChangeNotifier扩展或混合到此类。然后你就可以notifyListeners()
随时随地调用方法了!(但是当然,不要调用notifyListeners,除非您使用复杂的对象或发送相同的值)
此外,这些类最好被称为“Controller”、“ViewModel”、“BLoC”或任何其他名称,以表明它们正在改变/控制您的值并在需要时触发 UI 重建。(您首先应该做的是:将 UI 与逻辑层分开)。
\n 归档时间: |
|
查看次数: |
5498 次 |
最近记录: |