我喜歡在有意義的時候在我的類中使用 final 成員,但是我在嘗試做一些相對簡單的事情時遇到了問題:
import 'dart:ui';
class Foo {
final PictureRecorder recorder;
final Canvas canvas;
final int margin;
Foo({
this.margin = 10,
}) : recorder = PictureRecorder(),
canvas = Canvas(recorder) { // this line errors out
}
}
我從編譯器得到的錯誤是:
The instance member 'recorder' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression
有沒有另一種方法可以在不使該canvas領域成為非決賽的情況下做我想做的事?
我知道我可以使用非最終私有欄位和自定義 getter 使類“從外部”看起來相似,但這感覺像是一種不必要的解決方法。
uj5u.com熱心網友回復:
嘗試late對canvas.
late final Canvas canvas;
并且建構式應該像這樣更新:
Foo({
this.margin = 10,
}) : recorder = PictureRecorder() {
canvas = Canvas(recorder);
}
查看此帖子以獲取更多資訊:https : //dev.to/pktintali/late-variables-in-dart-dart-learning-series-1-2opf
uj5u.com熱心網友回復:
您可以使用工廠建構式來呼叫您的真實(隱藏)建構式,如下所示:
class Foo {
final PictureRecorder recorder;
final Canvas canvas;
final int margin;
factory Foo({
int margin = 10,
}) {
final recorder = PictureRecorder();
final canvas = Canvas(recorder);
return Foo._(
recorder: recorder,
canvas: canvas,
margin: margin,
);
}
Foo._({
required this.recorder,
required this.canvas,
required this.margin,
});
}
由于在工廠主體內部運行時我們還沒有創建任何物件,所以只要我們回傳一個與工廠建構式所屬型別兼容的物件,我們就可以做任何事情。
所以我們可以創建所有必要的值,然后將它們轉發給我們真正的建構式并防止使用任何late變數。
uj5u.com熱心網友回復:
你可以這樣做
class Foo {
final PictureRecorder recorder;
late final Canvas canvas;
final int margin;
Foo({
this.margin = 10,
}) : recorder = PictureRecorder() {
canvas = Canvas(recorder);
}
}
uj5u.com熱心網友回復:
這是我想到的解決方法,但我寧愿不這樣做:
import 'dart:ui';
class Foo {
final PictureRecorder recorder;
Canvas? _canvas;
final int margin;
Canvas get canvas => _canvas!;
PatternVisualizer({
this.margin = 10,
}) : recorder = PictureRecorder() {
_canvas = Canvas(recorder);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374701.html
上一篇:如何從顫振中的串列中獲取特定資訊
