【问题标题】:Flutter - Provider - setstate or markneedsbuild() called during buildFlutter - Provider - 在构建期间调用 setstate 或 markneedsbuild()
【发布时间】:2020-08-11 04:41:23
【问题描述】:

我有一个 Flutter 项目。 我正在使用 Provider (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();  
  }

}

这是我的用户界面代码

Consumer<NotebookState>(builder: (context, state, a) { 
             return FutureBuilder(
                     future: state.getNotebook(),
                     builder: (BuildContext context, snapshot) {
                       return snapshot.hasData
                                ? createNotebookList(context, snapshot.data)
                                : Container();  }); }

【问题讨论】:

    标签: flutter state flutter-layout setstate provider


    【解决方案1】:

    我猜你应该从getNotebook() 函数中删除通知侦听器。 原因是notifyListener 重建了您的小部件树,因为它导致了setState。并且您无法在使用Future Builder 构建小部件期间重建小部件,因此您不能使用 setState(或在这种情况下通知侦听器) builder 就像你一样。

    【讨论】:

    • 谢谢!!你太棒了!它对我有用! :)
    【解决方案2】:

    我通过从我的初始化状态中删除这行代码解决了这个问题

     context.read<CamerasProvider>().setCamerasList();
    

    现在我的应用运行良好

    【讨论】:

      【解决方案3】:

      当我遇到问题时,问题是我在构建小部件时调用了我的提供程序类,我调用了该类以使用 notifylistners(); 更新 var, 由于它重建了整个小部件树,但同时小部件树正在构建..soo 它无法重建尚未制作的树..因此问题..尝试阅读错误中给出的段落以解决您的问题问题..

      【讨论】:

        猜你喜欢
        • 2020-04-10
        • 2020-06-29
        • 2020-12-12
        • 2020-12-28
        • 2021-01-06
        • 2021-05-31
        • 2021-08-24
        相关资源
        最近更新 更多