Dispose widget when navigating to new route

后端 未结 2 760
离开以前
离开以前 2021-02-13 03:36

I have two screens in my app.

Screen A runs a computationally expensive operation while opened, and properly disposes by cancelling animations/subscriptions to the datab

相关标签:
2条回答
  • 2021-02-13 04:02

    call Navigator.pushReplacement when routing between first and second screen.

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MaterialApp(
        title: 'Navigation Basics',
        home: FirstRoute(),
      ));
    }
    
    class FirstRoute extends StatefulWidget {
      @override
      _FirstRouteState createState() => _FirstRouteState();
    }
    
    class _FirstRouteState extends State<FirstRoute> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('First Route'),
          ),
          body: RaisedButton(
            child: Text('Open route'),
            onPressed: () {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(builder: (context) => SecondRoute()),
              );
            },
          ),
        );
      }
    
      @override
      void dispose() {
        // Never called
        print("Disposing first route");
        super.dispose();
      }
    }
    
    class SecondRoute extends StatefulWidget {
      @override
      _SecondRouteState createState() => _SecondRouteState();
    }
    
    class _SecondRouteState extends State<SecondRoute> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Second Route"),
          ),
          body: RaisedButton(
            onPressed: () {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(builder: (context) => FirstRoute()),
              );
            },
            child: Text('Go back!'),
          ),
        );
      }
    
      @override
      void dispose() {
        print("Disposing second route");
        super.dispose();
      }
    }
    

    Try this

    0 讨论(0)
  • 2021-02-13 04:05

    I know it's a bit late but I think you should override the deactivate method. Since we are changing the page we are not actually destroying it, that's why the dispose isn't being called.

    If you'd like more information this page lists the lifecycle of the stateful widgets.

    From the link:

    'deactivate()' is called when State is removed from the tree, but it might be reinserted before the current frame change is finished. This method exists basically because State objects can be moved from one point in a tree to another.

    0 讨论(0)
提交回复
热议问题