【问题标题】:How to show an indicator while data is being fetched from databased如何在从数据库中获取数据时显示指标
【发布时间】:2020-04-21 07:15:29
【问题描述】:

我正在尝试在应用启动时打开数据库。当我尝试从数据库中读取数据时,它需要大约 1 秒或更长时间,并且由于读取方法是 Future,因此应用程序会在数据库初始化之前加载主小部件树,并且由于 fetch 方法尚未完成加载,因此它返回空值。有没有其他方法可以在应用程序启动时加载数据库?这是我的代码:

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()),
          ),
        ],
      ),
    ),
  ),
);
}
}

【问题讨论】:

    标签: flutter flutter-layout sqflite


    【解决方案1】:

    如果您在加载此数据之前无法向用户显示任何有意义的内容,那么您最好在调用 runApp 之前通过使 main 方法异步来执行此操作。

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

    【讨论】:

    • 其实我可以给他们看。例如在这个例子中,我可以显示容器,但我需要等待数据库加载,然后在文本中显示数字。
    • 正如我所说,Future 会在完成工作后返回数据,但我希望它在应用初始化之前发生。在启动画面完成之前。
    • 您确定在runApp 之前启动画面消失了吗?叫?如果你正确地await 你的数据,正如我所展示的,我认为它应该这样做......你的结果是什么?
    【解决方案2】:

    您可以使用 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),
                                    ),
                                  );
                                }
                              },
                            ),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2015-11-26
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多