尽管调用了 super.dipose(),但未能在 Flutter 中调用 super.dispose 时出现错误?

Kdo*_*don 1 flutter

我收到 super.dispose 无法调用的错误,即使我在重写的方法中调用 super.dipose 并且不确定为什么会发生此错误。

我尝试过不同的方法,例如将 super.dispose 包装在 WidgetsBinding.instance!.addPostFrameCallback((timeStamp) { }) 中,但这不起作用。

有什么想法可能会发生这种情况吗?有什么方法可以强制执行/修复它?

(下面我从 sqlite 数据库中选择随机单词,一切都运行良好)。

谢谢你!

代码

import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:learn_to_read/Pages/WordMatch/answerManager.dart';
import 'package:learn_to_read/Pages/WordMatch/pageProgressBar.dart';
import 'package:learn_to_read/Pages/WordMatch/pageProgressManager.dart';
import 'package:learn_to_read/animations/colorChange.dart';
import 'package:learn_to_read/animations/customScrollPhysics.dart';
import 'package:learn_to_read/database/databaseManager.dart';
import 'package:provider/provider.dart';
import 'package:sqflite/sqflite.dart';
import 'contents.dart';
import 'homeBar.dart';

class WordMatch extends StatefulWidget {

  @override
  _WordMatchState createState() => _WordMatchState();
}

class _WordMatchState extends State<WordMatch> with ChangeNotifier {
  List<String> _originalList = [];
  List<String> _selectedList = [];

  void newPage(int i) {
    context.read<AnswerManager>().currentPage = i;
    context.read<PageProgressManager>().incrementProgressDots(i);
  }

  Future<List<String>> generateData() async {
    DatabaseManager _databaseManager = DatabaseManager();
    Database _database = await _databaseManager.initDatabase();
    List<Map> _list = await _databaseManager.createList(_database);
    return List.generate(_list.length, (index) => _list[index]["Word"]);
  }

  Future<bool> populateLocalLists(List<String> _list) async {
    _originalList = _list;
    context.read<AnswerManager>().setTotalCards(_originalList.length);
    context.read<AnswerManager>().calculateTotalPages();

    return true;
  }

  Future<void> selectInitialWords(bool _listsPopulated) async {
    randomWordSelector();
    setState(() {});
  }

  void selectSubsequentWords(int i) async {
    _selectedList.clear();
    randomWordSelector();
  }

  void setUp() async {
    final _list = await generateData();
    final _listsPopulated = await populateLocalLists(_list);
    await selectInitialWords(_listsPopulated);
  }

  void initState() {
    context.read<PageProgressManager>().progressDotTracker = 0;
    context.read<AnswerManager>().resetVariables();
    bool accepted = false;

    setUp();
    super.initState();
  }


  @override
  void didChangeDependencies() {

    if (context.read<AnswerManager>().currentPage !=
            Provider.of<AnswerManager>(context).itemCount &&
        Provider.of<AnswerManager>(context).cardsUpdated == false) {
      WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
        selectSubsequentWords(0);
        context.read<AnswerManager>().resetPoints();
      });
    }
    super.didChangeDependencies();
  }

  @override
  void dispose() {
    super.dispose();
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        toolbarHeight: 0,
        elevation: 0,
        title: Text('Match'),
        backgroundColor: Colors.blueAccent,
        centerTitle: true,
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          HomeBar(),
          Expanded(
            flex: 5,
            child: PageView.builder(
                itemCount: context.watch<AnswerManager>().itemCount,
                pageSnapping: true,
                physics: CustomScrollPhysics(parent: null),
                onPageChanged: newPage,
                scrollDirection: Axis.vertical,
                itemBuilder: (context, int) {
                  return Padding(
                    padding: const EdgeInsets.all(0),
                    child: ColorChangeUser(
                      duration: 500,
                      colorBegin: Colors.orange,
                      colorEnd: Colors.green,
                      widget: Container(
                        child: Contents(
                          words: _selectedList,
                        ),
                      ),
                    ),
                  );
                }),
          ),
          PageProgressBar(),
        ],
      ),
    );
  }

  void randomWordSelector() {
    if(_originalList.length == 0){return;}
    Random rn = Random();
    for (int i = 0; i < 4; i++) {
      int j = rn.nextInt(_originalList.length);
      _selectedList.add(_originalList[j]);
      _originalList.removeAt(j);
    }
  }



}



Run Code Online (Sandbox Code Playgroud)

错误信息

完成小部件树时抛出以下断言:_WordMatchState.dispose 无法调用 super.dispose。

dispose() 实现必须始终调用其超类 dispose() 方法,以确保完全释放小部件使用的所有资源。抛出异常时,堆栈是:#0 StatefulElement.unmount。(包:flutter/src/widgets/framework.dart:4804:7) #1 StatefulElement.unmount (包:flutter/src/widgets/framework.dart:4811:6) #2 _InactiveElements._unmount (包:flutter/src /widgets/framework.dart:1847:13) #3 _InactiveElements._unmount。(包:flutter/src/widgets/framework.dart:1845:7) #4 SingleChildRenderObjectElement.visitChildren (包:flutter/src/widgets/framework.dart:6070:14) ...

Kdo*_*don 6

好吧——所以我终于明白了我做错了什么,以防其他人犯同样的错误。

我已将 ChangeNotifier(来自 Provider)留在 _WordMatchState(我不再需要)上并且忘记删除。耶。