Как показать индикатор во время выборки данных из базы данных - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь открыть базу данных при запуске приложения. Когда я пытаюсь прочитать данные из базы данных, это занимает около 1 секунды или более, и, поскольку метод read равен Future, приложение загружает главное дерево виджетов до инициализации базы данных, и поскольку метод fetch еще не завершил загрузку, он возвращает ЗНАЧЕНИЕ NULL. Есть ли другой способ загрузить базу данных при запуске приложения? Вот мой код:

void main() => runApp(MaterialApp(
  home: MyApp(),
));

class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
FlutterStatusbarcolor.setStatusBarColor(Colors.grey);


List<int> settings = [];

getSettings() async {

  try {
    List<SettingsDB> settingsGetter = await getData('settings', 'SettingsDB');
    SettingsDB settingsDBInstance = settingsGetter[0];
    print(settingsGetter);
    settings.add(settingsDBInstance.darkThemeEnabled);
    settings.add(settingsDBInstance.freeExamsProgress);
    settings.add(settingsDBInstance.mainExamsProgress);
    settings.add(settingsDBInstance.signsExamsProgress);
    settings.add(settingsDBInstance.mixedExamsProgress);
  }catch (e) {
    print(e);
  }
}
getSettings();

return MaterialApp(
  debugShowCheckedModeBanner: false,
  title: 'title',
  home: MainPage(settings: settings,),
);
}
}

class MainPage extends StatefulWidget {

final List<int> settings;

const MainPage({Key key, this.settings}) : super(key: key);

@override
_MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {

@override
Widget build(BuildContext context) {



return Scaffold(
  backgroundColor: Color(0xffE0E0E0),
  body:

  SingleChildScrollView(
    physics: BouncingScrollPhysics(),
    child: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[

          SizedBox(height: 36.0,),

          Container(
            width: double.infinity,
            height: double.infinity,
            child: Text(widget.settings[0].toString()),
          ),

          Container(
            width: double.infinity,
            height: double.infinity,
            child: Text(widget.settings[1].toString()),
          ),

          Container(
            width: double.infinity,
            height: double.infinity,
            child: Text(widget.settings[2].toString()),
          ),

          Container
            width: double.infinity,
            height: double.infinity,
            child: Text(widget.settings[3].toString()),
          ),
        ],
      ),
    ),
  ),
);
}
}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Вы можете использовать виджет FutureBuilder, как показано ниже:

                       FutureBuilder(
                          future: widget._bloc.getAllPartners(),
                          builder: (BuildContext context,
                              AsyncSnapshot<List<UserPartner>> snapshot) {
                            if (snapshot.hasData) {
                              return Flexible(
                                child: _getSortByPartnerDropDown(snapshot.data),
                              );
                            } else {
                              return Flexible(
                                child: CircularProgressIndicator(
                                  valueColor: AlwaysStoppedAnimation<Color>(
                                      IntimassyColor.primaryTextWhiteHint),
                                ),
                              );
                            }
                          },
                        ),
0 голосов
/ 21 апреля 2020

Если вы не можете показать пользователю что-либо значимое перед загрузкой этих данных, вы также можете сделать это перед вызовом runApp, сделав основной метод asyn c.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final data = await getData(); // whatever is needed to load your data
  runApp(MyApp());
}
...