Search code examples
flutterflutter-dependenciesflutter-web

Flutter initState and dispose called twice during first build


I've have an app with three screens. When I go from second screen to third screen. The initState of the third screen is called twice along with dispose. Relevant parts of code :

Screen 2

  @override
  void dispose() {
    print("Screen2: dispose");
    socket.io.disconnect();
    super.dispose();
  }
socket.on('start-resp', (_) {
      Navigator.pushReplacement(
          context,
          MaterialPageRoute(
              builder: (context) => GameScreen(
                    username: widget.username,
                  )));
    });

Screen 3

  @override
  void dispose() {
    print("Screen3: dispose");
    socket.io.disconnect();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    print("Screen3: init");
  }

  @override
  Widget build(BuildContext context) {
    print("Screen3: Build");

OutPut:

Screen3: init
Screen3: Build
Screen3: init
Screen3: Build
Screen3: dispose
Screen2: dispose

Solution

  • This is most likely what's going on:

    socket.on('start-resp', (_) {
          print("MOST LIKELY I'M CALLED TWICE");
          Navigator.pushReplacement(
              context,
              MaterialPageRoute(
                  builder: (context) => GameScreen(
                        username: widget.username,
                      )));
        });