我收到 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。
好吧——所以我终于明白了我做错了什么,以防其他人犯同样的错误。
我已将 ChangeNotifier(来自 Provider)留在 _WordMatchState(我不再需要)上并且忘记删除。耶。
| 归档时间: |
|
| 查看次数: |
6029 次 |
| 最近记录: |