我正在将BottomNavigation与PageView和Charts Flutter(charts_flutter:^ 0.6.0)一起使用。我意识到如果我使用pageController.jumpToPage(index),它将导致在dispose()之后调用setState()的错误:BaseChartState。如果更改为pageController.animateToPage,偶尔会产生错误。
我在setState之前使用过if(mount),但没有帮助。
pubspec.yaml: chart_flutter:^ 0.6.0
home.dart:
import 'package:flutter/material.dart';
import 'page1.dart';
import 'page2.dart';
import 'page3.dart';
class Home extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return _HomeState();
}
}
class _HomeState extends State<Home>{
//PageController pageController;
int currentBottomNavIndex = 0;
onTapped(int index) {
setState(() {
currentBottomNavIndex = index;
pageController.jumpToPage(index);
//pageController.animateToPage(index, duration: Duration(milliseconds: 500), curve: Curves.ease);
});
}
PageController pageController = PageController(
initialPage: 0,
//keepPage: false,
keepPage: true,
);
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
pageController.dispose();
}
Widget buildPageView() {
return PageView(
controller: pageController,
onPageChanged: (index) {
pageChanged(index);
},
children: <Widget>[
Page1(),
Page2(),
Page3(),
],
);
}
void pageChanged(int index) {
setState(() {
currentBottomNavIndex = index;
});
}
@override
Widget build(BuildContext context){
return new Scaffold(
appBar: new AppBar(
title: Text('Home'),
),
//body: bottomNav[currentBottomNavIndex],
body: buildPageView(),
bottomNavigationBar: BottomNavigationBar(
onTap: onTapped,
currentIndex: currentBottomNavIndex,
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text("Page1"),
),
BottomNavigationBarItem(
icon: Icon(Icons.mail),
title: Text('Page2'),
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
title: Text("Page3"),
),
],
),
);
}
}
Page1和Page2是普通文本。第3页是饼图。
当我从Page3-> Page 2或Page1单击时。我将收到以下错误:
错误结果:
颤振:S计划程序库引起的异常CA ═════════════════════ 颤抖:在调度程序回调期间引发了以下断言: flutter:在dispose()之后调用的setState():BaseChartState#64182(生命周期状态:已失效,不是 颤振:已安装,行情指示器:追踪0个行情指示器) 颤动:如果您在不再出现在窗口小部件中的窗口小部件的状态对象上调用setState(),则会发生此错误 flutter:窗口小部件树(例如,其父窗口小部件不再在其构建中包括该窗口小部件)。这个错误 颤动:当代码从计时器或动画回调中调用setState()时可能发生。首选解决方案 flutter:用于取消计时器或停止在dispose()回调中收听动画。另一个 flutter:解决方案是在调用setState()之前检查此对象的“ mount”属性,以确保 颤动:对象仍在树中。 flutter:如果由于另一个对象正在调用setState(),则此错误可能表明内存泄漏 颤动:从树中删除该State对象后,对其保留引用。避免记忆 抖动:泄漏,请考虑在dispose()期间中断对该对象的引用。
更新:
我已将if(mount)放置在我的dart文件中,我猜它是错误的位置。我编辑了包文件base_chart_state.dart第72行:
@override
void requestRebuild() {
if(mounted) setState(() {});
}
添加if(mount)后,即可解决问题。