Как показать CircularProgressIndicator перед запуском приложения Flutter?

В моем демонстрационном приложении мне нужно загрузить с сервера 2 файла JSON. Оба JSON содержат большие данные. В своем приложении Flutter я вызываю json с помощью Future + async + await, чем вызываю для создания виджета с помощью runApp. В теле пытаюсь активировать CircularProgressIndicator. Он показывает appBar и его содержимое, а также пустое белое тело страницы, а через 4 или 5 секунд загружает данные в фактическом теле.

Мой вопрос: сначала мне нужно показать CircularProgressIndicator, а после загрузки данных я вызову runApp (). Как я могу это сделать?

// 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
)

person Community    schedule 08.05.2018    source источник


Ответы (1)


Вам нужно поместить индикатор данных / или загрузки внутри каркаса, показывать каркас каждый раз, есть ли у вас данные или нет, содержимое внутри вы можете делать то, что хотите.

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'));
  }
}

`

person ThaSaleni    schedule 08.05.2018
comment
@ThaSalani тело: находится внутри подмости. Я не понимаю. Не могли бы вы предоставить демо-код, пожалуйста - person ; 08.05.2018
comment
Все, что вы показываете, находится в «runApp», поскольку оно запускает приложение. Вы должны выполнить «runApp» напрямую. В «MyApp» выполните загрузку данных, покажите индикатор прогресса и покажите данные, когда она будет завершена. В настоящее время вы ожидаете данных для запуска приложения, это белый экран, который вы видите. - person Rene; 08.05.2018
comment
@ Рене, мне нужно загрузить 4 или 5 json. у вас есть рабочие примеры? - person ; 12.05.2018
comment
@TheSaleni Я сделал. Я стараюсь. Спасибо - person ; 16.05.2018
comment
@TheSaleni, спасибо. Модифицируя мой проект, он сейчас работает. - person ; 18.05.2018