Android 如何在从firestore获取数据时显示加载微调器
我是个新手。以下是我从firestore集合(称为posts)获取数据的代码。当第一次加载应用程序时,需要几秒钟才能加载数据,直到它显示一个空白屏幕。这种情况仅在第一次发生。因此,在加载数据之前,如何向用户显示加载微调器或其他内容?(并非这不是全部代码)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(); 类(家庭状态扩展状态){ 字符串标题、
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或字段抱歉,我的错误,正在等待不加载。