Flutter - Provider - setstate или markneedsbuild (), вызываемые во время сборки - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть проект с 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();  }); }

1 Ответ

1 голос
/ 27 апреля 2020

Полагаю, вам следует удалить уведомляющих слушателей из функции getNotebook(). Причина в том, что notifyListener перестраивает ваше дерево виджетов, потому что оно вызывает setState. И вы не можете перестраивать виджеты во время его построения с Future Builder, поэтому вы не можете использовать setState (или уведомить слушателей в этом случае) в builder как и вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...