Flutter pageController带图表的jumpToPage Flutter在处置后导致setState调用

时间:2019-06-18 13:54:15

标签: flutter

我正在将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)后,即可解决问题。

0 个答案:

没有答案