我有一個Provider 模型,例如
provider_model.dart:
import 'package:flutter/material.dart';
class ProviderModel extends ChangeNotifier {
final List<String> _myList = [];
List<String> get myList => [..._myList];
void addItem(String item) {
_myList.add(item);
notifyListeners();
}
}
現在,Flutter 檔案
現在,當我單擊發送按鈕時,它會呼叫_sendMessage()(上面的代碼)。然后因為StreamBuilder() hasData它運行這一行(上面的代碼):
provider.addItem('I was added');
但是,這是我的錯誤出現的地方,我收到以下錯誤:
The following assertion was thrown while dispatching notifications for ProviderModel:
setState() or markNeedsBuild() called during build.
- 為什么我會收到此錯誤?小部件在哪里重建?請參閱構建期間呼叫的 Flutter Provider setState() 或 markNeedsBuild() 的答案
uj5u.com熱心網友回復:
您可以從 獲得幫助addPostFrameCallback,但代價是它將在每一幀上不斷重建,要控制這種行為,您可以在狀態類上使用 bool。
bool isDone = false;
void addItemH() {
if (!isDone) {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
Provider.of<ProviderModel>(context, listen: false)
.addItem('I was added');
isDone = true;
});
}
}
和建設者
builder: (context, snapshot) {
if (snapshot.hasData) {
addItemH();
return Text("Item added");
并控制下一次插入。
void _sendMessage() {
if (_controller.text.isNotEmpty) {
isDone = false;
_channel.sink.add(_controller.text);
print('done');
}
}
}
如果你只想單次添加資料,最好在 initState 里面做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496452.html
上一篇:你如何在Dart中洗牌?
