Flutter-提供程序-生成期间调用的setstate或markneedsbuild()

问题描述 投票:0回答:1

我与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();  }); }
flutter state flutter-layout setstate provider
1个回答
1
投票

我想您应该从getNotebook()函数中删除通知侦听器。原因是notifyListener会重建小部件树,因为它会导致setState。在用Future Builder生成小部件树时,您无法重建小部件,因此您不能在其中使用setState(或在这种情况下通知侦听器)像您一样的builder

© www.soinside.com 2019 - 2024. All rights reserved.