diegoveloper / flutter_percent_indicator

Flutter percent indicator library
BSD 2-Clause "Simplified" License
679 stars 206 forks source link

Dispose method is not called #85

Closed dev-marceloborba closed 3 years ago

dev-marceloborba commented 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'),
      ),
    );
  }
}
diegoveloper commented 3 years ago

set addAutomaticKeepAlive: false to your CircularPercentIndicator