Search code examples
flutterdartfutureflutter-futurebuilder

Flutter - FutureBuilder fires twice on hot reload


In my flutter project when I start the project in the simulator everything works fine and the future builder only fires once, but when I do hot reload the FutureBuilder fires twice which causes an error any idea how to fix this?

  Future frameFuture()  async {
    var future1 = await AuthService.getUserDataFromFirestore();
    var future2 = await GeoService.getPosition();
    return [future1, future2];
  }

  @override
  void initState() {
    user = FirebaseAuth.instance.currentUser!;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: frameFuture(),
        builder: (context, snap) {
          if (snap.connectionState == ConnectionState.done && snap.hasData) return HomePage();
          else return Container(
            color: Colors.black,
            child: Center(
              child: spinKit,
            ),
          );
        }
    );
  }

Solution

  • I solved the issue. I put the Future function in the initState and then used the variable in the FutureBuilder. I'm not sure why it works this way, but here's the code:

      var futures;
    
      Future frameFuture()  async {
        var future1 = await AuthService.getUserDataFromFirestore();
        var future2 = await GeoService.getPosition();
        return [future1, future2];
      }
    
      @override
      void initState() {
        user = FirebaseAuth.instance.currentUser!;
        super.initState();
        futures = frameFuture();
      }
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder(
            future: futures,
            builder: (context, snap) {
              if (snap.connectionState == ConnectionState.done && snap.hasData) return HomePage();
              else return Container(
                color: Colors.black,
                child: Center(
                  child: spinKit,
                ),
              );
            }
        );
      }