我正在用 State 小部件構建一個簡單的秒表。
初始化 State 中的變數:
final laps = <int>[];
int milliseconds = 0;
毫秒在計時器中每 0.1 秒更新一次(按下啟動按鈕后):
setState((){
milliseconds = 100;
});
圈數方法更新圈數串列(按下圈數按鈕后,計時器運行時):
setState((){
laps.add(milliseconds);
});
以及顯示圈數的方法(在每個 setState 的 build() 中運行):
for(int milliseconds in laps)
Text(_format(milliseconds))
問題是,如果我忘記在 for-in 方法中進行型別轉換,如下所示:
for(milliseconds in laps)
這會破壞計時器,它只會停止遞增。它繼續運行,但是當按下圈數時,毫秒只是停留在最后一個值。怎么會這樣?我認為毫秒是一個變數,圈數串列是另一個變數,它的值是另一個變數......這令人困惑。
***帶有完整代碼的 DartPad 是 https://dartpad.dev/?id=09114fd8f5332610042b1af85afdcae8并且沒有型別轉換(圈數不作業版本)。為了讓它作業,在第 149 行添加int毫秒。運行需要一分鐘。
uj5u.com熱心網友回復:
宣告變數時,您必須使用Type variableName = value;or var variableName = value(您也可以使用final variableName = value;or var variableName;,我確定其他一些,但這不是重點)。
當你這樣做時,for (milliseconds in laps)你既不輸入型別也不添加var或final關鍵字。如果您之前沒有宣告milliseconds變數,這會給您一個錯誤,因為您已經宣告了,它只是將每次迭代的值分配給所述變數,從而有效地破壞了您的代碼。
這類似于這個例子
int i=183;
for (i=0; i<3; i ) {
print(i);
}
print(i);
如果我運行此代碼,我會得到以下輸出:
0
1
2
2
如果我添加 var,我會得到以下輸出:
0
1
2
183
所以基本上如果你添加varorint到回圈,你是在 for 回圈范圍內重新定義變數,如果你不直接分配給已經存在的變數,這反過來會破壞應用程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/388062.html
