Search code examples
jsonasync-awaitflutterfutureprogress-indicator

How to show CircularProgressIndicator before Flutter App Start?


In my demo app I need to load a 2 JSON file from server. Both JSON has large data in it. I my Flutter app I call the json using Future + async + await than I call to create a widget with runApp. In the body I try to activate a CircularProgressIndicator. It shows appBar and its content as well as empty white page body and 4 or 5 seconds later loads the data in actual body.

My question is I need to show the CircularProgressIndicator first and once the data load I will call runApp(). How do I do that?

// MAIN
void main() async {
    _isLoading = true;

  // Get Currency Json
  currencyData = await getCurrencyData();

  // Get Weather Json
  weatherData = await getWeatherData();

   runApp(new MyApp());
}



// Body
body: _isLoading ? 
new Center(child: 
    new CircularProgressIndicator(
        backgroundColor: Colors.greenAccent.shade700,
    )
) :
new Container(
    //… actual UI
)

Solution

  • You need to put the data/or loading indicator inside a scaffold, show the scaffold everytime whether you have data or not, the content inside you can then do what you want to do.`

    import 'dart:async';
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(
        MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Hello Rectangle',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Hello Rectangle'),
            ),
            body: HelloRectangle(),
          ),
        ),
      );
    }
    
    class HelloRectangle extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Container(
            color: Colors.greenAccent,
            height: 400.0,
            width: 300.0,
            child: Center(
              child: FutureBuilder(
                future: buildText(),
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  if (snapshot.connectionState != ConnectionState.done) {
                   return CircularProgressIndicator(backgroundColor: Colors.blue);
                  } else {
                   return Text(
                      'Hello!',
                      style: TextStyle(fontSize: 40.0),
                      textAlign: TextAlign.center,
                    );
                  }
                },
              ),
            ),
          ),
        );
      }
    
      Future buildText() {
        return new Future.delayed(
            const Duration(seconds: 5), () => print('waiting'));
      }
    }
    

    `