Closed dev-marceloborba closed 3 years ago
This problem occurs when using a home page with BottomNavigationBar and PageView to navigate between different pages.
When switching from Page1 (where the CircularPercentIndicator widget is instantiated) to Page2, the dispose method on Page1 is not been called.
So, if I need to do some code on dispose method, actually I can't, because the code is not executed.
But if you remove the CircularPercentIndicator on Page1, the dispose method is called as expected.
To reproduce the problem, just use the following code.
home.dart
import 'package:flutter/material.dart'; import 'package:get_it_percent_indicator/pages/page1.dart'; import 'package:get_it_percent_indicator/pages/page2.dart'; class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { final pageController = PageController(); @override void dispose() { pageController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home'), ), body: PageView( controller: pageController, children: [ Page1(), Page2(), ], ), bottomNavigationBar: AnimatedBuilder( animation: pageController, builder: (context, child) { return BottomNavigationBar( currentIndex: pageController.page?.round() ?? 0, onTap: (value) { pageController.jumpToPage(value); }, items: [ BottomNavigationBarItem( icon: Icon(Icons.person), label: 'Page 1', ), BottomNavigationBarItem( icon: Icon(Icons.camera), label: 'Page 2', ), ], ); }, ), ); } }
page1.dart
import 'package:flutter/material.dart'; import 'package:percent_indicator/circular_percent_indicator.dart'; class Page1 extends StatefulWidget { @override _Page1State createState() => _Page1State(); } class _Page1State extends State<Page1> { @override void dispose() { print('dispose page 1'); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: CircularPercentIndicator( radius: 60.0, lineWidth: 5.0, percent: 1.0, center: new Text("100%"), progressColor: Colors.green, ), ), ); } }
page2.dart
import 'package:flutter/material.dart'; class Page2 extends StatefulWidget { @override _Page2State createState() => _Page2State(); } class _Page2State extends State<Page2> { @override void dispose() { print('dispose page2'); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Text('Page 2'), ), ); } }
set addAutomaticKeepAlive: false to your CircularPercentIndicator
addAutomaticKeepAlive: false
CircularPercentIndicator
This problem occurs when using a home page with BottomNavigationBar and PageView to navigate between different pages.
When switching from Page1 (where the CircularPercentIndicator widget is instantiated) to Page2, the dispose method on Page1 is not been called.
So, if I need to do some code on dispose method, actually I can't, because the code is not executed.
But if you remove the CircularPercentIndicator on Page1, the dispose method is called as expected.
To reproduce the problem, just use the following code.
home.dart
page1.dart
page2.dart