Android 如何在从firestore获取数据时显示加载微调器

Android 如何在从firestore获取数据时显示加载微调器,android,firebase,flutter,dart,google-cloud-firestore,Android,Firebase,Flutter,Dart,Google Cloud Firestore,我是个新手。以下是我从firestore集合(称为posts)获取数据的代码。当第一次加载应用程序时,需要几秒钟才能加载数据,直到它显示一个空白屏幕。这种情况仅在第一次发生。因此,在加载数据之前,如何向用户显示加载微调器或其他内容?(并非这不是全部代码) class ForumHome扩展了StatefulWidget{ @凌驾 _ForumHomeState createState(); } dbMethods dbcrud=新的dbMethods(); 类(家庭状态扩展状态){ 字符串标题、

我是个新手。以下是我从firestore集合(称为posts)获取数据的代码。当第一次加载应用程序时,需要几秒钟才能加载数据,直到它显示一个空白屏幕。这种情况仅在第一次发生。因此,在加载数据之前,如何向用户显示加载微调器或其他内容?(并非这不是全部代码)

class ForumHome扩展了StatefulWidget{
@凌驾
_ForumHomeState createState();
}
dbMethods dbcrud=新的dbMethods();
类(家庭状态扩展状态){
字符串标题、内容;
//订阅帖子详情
流媒体订阅;
列表快照;
CollectionReference CollectionReference=
Firestore.instance.collection(“posts”);
@凌驾
void initState(){
super.initState();
订阅=collectionReference.snapshots().listen((datasnapshot){
设置状态(){
快照=datasnapshot.documents;
});
});
}
@凌驾
小部件构建(构建上下文){
int num=快照?.length±0;
返回脚手架(
appBar:appBar(标题:文本(“创意论坛”),背景颜色:Colors.pink),
正文:新建ListView.builder(
itemCount:num,
itemBuilder:(上下文,索引){
归还新卡(
标高:15.0,
保证金:所有边缘套(10.0),
孩子:新的ListTile(
onTap:(){
//用于计算视图计数
快照[索引]
.参考
.updateData({'Views':快照[index].data['Views']+1});

您需要评估连接的状态

body: new ListView.builder(
        itemCount: num,
        itemBuilder: (context, index) {
          if (snapshot.connectionState == ConnectionState.waiting)
          return CircularProgressIndicator();
          return new Card(
            elevation: 15.0,
            margin: EdgeInsets.all(10.0),
            child: new ListTile(
                onTap: () {
                  //For udating the view count
                  snapshot[index]
                      .reference
                      .updateData({'Views': snapshot[index].data['Views'] + 1});

您需要评估连接的状态

body: new ListView.builder(
        itemCount: num,
        itemBuilder: (context, index) {
          if (snapshot.connectionState == ConnectionState.waiting)
          return CircularProgressIndicator();
          return new Card(
            elevation: 15.0,
            margin: EdgeInsets.all(10.0),
            child: new ListTile(
                onTap: () {
                  //For udating the view count
                  snapshot[index]
                      .reference
                      .updateData({'Views': snapshot[index].data['Views'] + 1});

我建议为circularProgress创建一个控制器,如示例所示:

class _testProgressState extends State<testProgress> {

bool _progressController = true;


@override
void initState() {
  super.initState();

  subscription = collectionReference.snapshots().listen((datasnapshot) {
    setState(() {
      snapshot = datasnapshot.documents;
      _progressController = false;
    });
  });

}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: _progressController
        ? CircularProgressIndicator()
        : ListView.builder(
            itemCount: 3,
            itemBuilder: (context, index) {
              return Card();
            }),
  );
}
}
class\u testProgressState扩展状态{
bool _progressController=true;
@凌驾
void initState(){
super.initState();
订阅=collectionReference.snapshots().listen((datasnapshot){
设置状态(){
快照=datasnapshot.documents;
_progressController=false;
});
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:_progressController
?循环压缩机指示器()
:ListView.builder(
物品计数:3,
itemBuilder:(上下文,索引){
返回卡();
}),
);
}
}

因此,每当您发现需要调用某个函数来收集数据时,只需将state setting _controllerProgress设置为true,当数据到达时将返回false!

我建议为circularProgress创建一个控制器,如示例所示:

class _testProgressState extends State<testProgress> {

bool _progressController = true;


@override
void initState() {
  super.initState();

  subscription = collectionReference.snapshots().listen((datasnapshot) {
    setState(() {
      snapshot = datasnapshot.documents;
      _progressController = false;
    });
  });

}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: _progressController
        ? CircularProgressIndicator()
        : ListView.builder(
            itemCount: 3,
            itemBuilder: (context, index) {
              return Card();
            }),
  );
}
}
class\u testProgressState扩展状态{
bool _progressController=true;
@凌驾
void initState(){
super.initState();
订阅=collectionReference.snapshots().listen((datasnapshot){
设置状态(){
快照=datasnapshot.documents;
_progressController=false;
});
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:_progressController
?循环压缩机指示器()
:ListView.builder(
物品计数:3,
itemBuilder:(上下文,索引){
返回卡();
}),
);
}
}

因此,每当您发现需要调用某个函数来收集数据时,只需将state setting _controllerProgress设置为true,当数据到达时将返回false!

您需要创建一个未来的小部件

 FutureBuilder(
        future: YOUR_ASYNC_TASK_HERE,
        builder: (context, AsyncSnapshot<YOUR_RETURN_TYPE_FROM_ASYNC> snapshot) {
          return (snapshot.connectionState == ConnectionState.done)?HomePage():_buildWaitingScreen();
        },
      ),

您需要创建一个未来的小部件

 FutureBuilder(
        future: YOUR_ASYNC_TASK_HERE,
        builder: (context, AsyncSnapshot<YOUR_RETURN_TYPE_FROM_ASYNC> snapshot) {
          return (snapshot.connectionState == ConnectionState.done)?HomePage():_buildWaitingScreen();
        },
      ),

您可以检查快照是否有数据,并在其加载时显示加载程序。此外,我已将您的listview扩展到一个单独的小部件

Widget _numcard(){
     if (snapshot != null) {
       ListView.builder(
            itemCount: num,
            itemBuilder: (context, index) {
              return new Card(
                elevation: 15.0,
                margin: EdgeInsets.all(10.0),
                child: new ListTile(
                    onTap: () {
                      //For udating the view count
                      snapshot[index]
                          .reference
                          .updateData({'Views': snapshot[index].data['Views'] + 1});
                    })});
          }else {return Container(
            child:CircularProgressIndicator());}}

您可以检查快照是否有数据,并在其加载时显示加载程序。此外,我已将您的listview扩展到一个单独的小部件

Widget _numcard(){
     if (snapshot != null) {
       ListView.builder(
            itemCount: num,
            itemBuilder: (context, index) {
              return new Card(
                elevation: 15.0,
                margin: EdgeInsets.all(10.0),
                child: new ListTile(
                    onTap: () {
                      //For udating the view count
                      snapshot[index]
                          .reference
                          .updateData({'Views': snapshot[index].data['Views'] + 1});
                    })});
          }else {return Container(
            child:CircularProgressIndicator());}}

感谢您的快速回复。但无法使用您的解决方案。它说没有为类“ConnectionState”定义getter“loading”。请尝试导入定义“loading”的库,将名称更正为现有getter的名称,或定义名为“loading”的getter或字段抱歉,我的错误,正在等待不加载。感谢您的快速回复。但无法使用您的解决方案。它说没有为类“ConnectionState”定义getter“loading”。请尝试导入定义“loading”的库,将名称更正为现有getter的名称,或定义名为“loading”的getter或字段抱歉,我的错误,正在等待不加载。