我与Flutter有一个项目。 我正在使用提供程序(4.0.5)进行状态管理。 我收到此警告,“在构建过程中调用了setstate或markneedsbuild()” 这对我来说是个大问题。我认为这个问题在发布模式下会越来越严重。 我该如何解决这个问题?
import 'package:example/models/notebook_model.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class NotebookState with ChangeNotifier {
DateTime notebookDate = DateTime.now();
DateTime notebookDateState(DateTime date){
notebookDate = date;
notifyListeners();
return notebookDate;
}
Future<List<NotebookModel>> getNotebook()
{
notifyListeners();
return NotebookBLL.getNotebooks();
}
addNotebook(String noteTitle, String content, String date){
NotebookModel newNotebook = NotebookModel(
noteTitle: noteTitle, content: content, date: date);
NotebookBLL.insert(newNotebook);
notifyListeners();
}
updateNotebook(int id, String noteTitle, String content, String date){
NotebookModel updateNotebook = NotebookModel(
id: id,
noteTitle: noteTitle,
content: content,
date: date
);
NotebookBLL.update(updateNotebook);
notifyListeners();
}
deleteNotebook(int id){
NotebookBLL.delete(id);
notifyListeners();
}
}
这是我的UI代码
Consumer<NotebookState>(builder: (context, state, a) {
return FutureBuilder(
future: state.getNotebook(),
builder: (BuildContext context, snapshot) {
return snapshot.hasData
? createNotebookList(context, snapshot.data)
: Container(); }); }
答案 0 :(得分:2)
我想您应该从getNotebook()
函数中删除通知侦听器。
原因是notifyListener
之所以重建窗口小部件树是因为它导致setState
。而且,在使用Future Builder
构建窗口小部件期间,您无法重建窗口小部件,因此您不能使用setState(或通知这样,您就可以像builder
那样使用监听器了。
答案 1 :(得分:-1)
我通过从初始化状态中删除这行代码解决了这个问题
context.read<CamerasProvider>().setCamerasList();
现在我的应用运行良好