Flutter - Provider - 在构建期间调用 setstate 或 markneedsbuild()
Flutter - Provider - setstate or markneedsbuild() called during build
我有一个 Flutter 项目。
我正在使用 Provider (4.0.5) 进行状态管理。
我收到此警告,"setstate or markneedsbuild() called during build"
这对我来说是个大问题。我认为这个问题会在发布模式下增长。
我该如何解决这个问题?
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(); }); }
我想您应该从 getNotebook()
函数中删除通知侦听器。
原因是 notifyListener
重建你的小部件树,因为它导致 setState
。而且你不能在使用 Future Builder
构建小部件的过程中重建小部件,所以你不能使用 setState(或通知在这种情况下的听众)像你一样builder
。
我通过从我的初始状态中删除这行代码解决了这个问题
context.read<CamerasProvider>().setCamerasList();
现在我的应用程序运行良好
当我遇到这个问题时,问题是我在构建小部件时调用我的提供商 class,我调用 class 使用 notifylistners();
更新 var,
由于它重建了整个小部件树,但同时正在构建小部件树..因此它无法重建尚未制作的树..因此出现问题..尝试阅读错误中给出的段落以解决您的问题问题..
我有一个 Flutter 项目。 我正在使用 Provider (4.0.5) 进行状态管理。 我收到此警告,"setstate or markneedsbuild() called during build" 这对我来说是个大问题。我认为这个问题会在发布模式下增长。 我该如何解决这个问题?
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(); }); }
我想您应该从 getNotebook()
函数中删除通知侦听器。
原因是 notifyListener
重建你的小部件树,因为它导致 setState
。而且你不能在使用 Future Builder
构建小部件的过程中重建小部件,所以你不能使用 setState(或通知在这种情况下的听众)像你一样builder
。
我通过从我的初始状态中删除这行代码解决了这个问题
context.read<CamerasProvider>().setCamerasList();
现在我的应用程序运行良好
当我遇到这个问题时,问题是我在构建小部件时调用我的提供商 class,我调用 class 使用 notifylistners();
更新 var,
由于它重建了整个小部件树,但同时正在构建小部件树..因此它无法重建尚未制作的树..因此出现问题..尝试阅读错误中给出的段落以解决您的问题问题..