dart - 是否可以使用类方法来初始化 Dart 中的最终属性?
问题描述
假设我有一个类,其中包含在其初始化期间传递的函数:
class Caller {
final _controller = StreamController<int>();
Caller(void Function(int) callback) {
_controller.stream.listen(callback);
}
void send(int x) {
_controller.sink.add(x)
}
}
是否可以用另一个类方法初始化 aCaller
同时也将其标记为final
?
class Container {
final Caller _caller;
int _val = 0;
void _doSomething(int x) {
_val += x;
_caller.send(_val);
}
Container() : _caller = Caller(_doSomething);
}
Dart 抱怨说"Only static members can be accessed in initializers."
我知道在调用构造函数之前你不能访问未初始化的参数,但是默认情况下“方法”实际上不是最终的吗?与其他属性不同,它不能动态修改。
那么,除了标记_caller
非最终并在构造函数中对其进行初始化之外,还有其他解决方法吗?
解决方案
不。
您目前不能创建两个对象,它们仅通过最终字段相互引用,或者相互传递给其他对象的构造函数。在对对象的任何引用变为可用之前,必须初始化最终字段,并且无法在另一个对象之前创建两个对象。
对于这种特殊情况,您可以提供listen
一种在创建Caller
. 您可以Caller
在调用之前创建listen
。(我建议在您不使用return by时使用forEach
而不是)。listen
StreamSubription
listen
在该语言的未来版本(以及不可为空的类型)中,我们打算引入后期初始化字段。然后就可以写了:
class Caller {
final _controller = StreamController<int>();
Caller(void Function(int) callback) {
_controller.forEach(callback);
}
}
class Container {
late final _caller = Caller(this._doSomething);
Container() {
_caller;
}
void _doSomething(int x) { ... }
}
这个迟到_caller
的字段将在您第一次阅读时被初始化。它仍然是最终的,您可以通过读取它来强制在构造函数中读取它。这有点骇人听闻,主要是因为虚假的读取初始化。
推荐阅读
- electron - Electron:details.webContentsId 在发布中消失(session.webRequest.onBeforeRequest 事件)
- c++ - 显式模板类实例化不包括编译器生成的成员函数的符号?
- javascript - 如何在工具提示消息中包含图标
- android - 在清单中声明全屏和沉浸式应用
- javascript - 当我尝试在 chrome 中创建书签时,控制台中出现错误“浏览器未定义”
- python - 如何对 seaborn 的 lmplot 进行 funcanimation
- nginx - 如何在 https NGINX 中将非 www 重定向到 www
- mysql - 除以 2 行表格并得出百分比
- sql-server - 使用 PowerShell 脚本创建具有混合模式身份验证的 SQL VM
- spring - Jdbc 模板和 Spring 的 keyHolder 的 Mockito 测试用例