将 RefreshIndicator 与 FutureBuilder 一起使用(QuerySnapshot 问题)
Using RefreshIndicator with FutureBuilder (QuerySnapshot issue)
我正在尝试在未来的构建器上使用刷新指示器小部件实现拉动刷新操作。
我设法让它正确加载,但是当我尝试通过拉动刷新来刷新列表时,无法通过我当前面临的问题。
1.
late Future<QuerySnapshot> postsList;
- 初始化数据
void initState() {
super.initState();
postsList = loadPostsList();
}
- 从 firestore 函数加载数据
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
return data;
}
- 现在这就是我卡住的地方,我想将
setState(() => this.postsList = data);
添加到 loadPostsList() 函数中,如下所示:
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
// HERE
setState(() => this.postsList = data);
return data;
}
但出现此错误:
A value of type 'QuerySnapshot<Object?>' can't be assigned to a variable of type 'Future<QuerySnapshot<Object?>>'.
我是 Flutter 的新手并且还在学习:),因此感谢任何帮助:),下面是完整的代码:
final keyRefresh = GlobalKey<RefreshIndicatorState>();
late Future<QuerySnapshot> postsList;
@override
void initState() {
super.initState();
postsList = loadPostsList();
}
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
return data;
}
FutureBuilder<QuerySnapshot>(
future: postsList,
builder: (context, snapshot) {
if (snapshot.hasData) {
final List<DocumentSnapshot> documents =snapshot.data!.docs;
return RefreshIndicator(
key: keyRefresh,
color: Colors.blue,
onRefresh: loadPostsList,
child: SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: documents.map((doc) => new PostCard(
author: doc['author'],
title: doc['title'],
description: doc['desc'],
),
).toList(),
),
);
} else if (snapshot.hasError) {
return Text('Error!');
} else {
return LoadingWidget();
}
},
),
错误是因为您将 data
定义为类型 QuerySnapshot
,并试图将其分配给您定义为类型 Future<QuerySnapshot>
的 postsList
。显然,它们是不同的类型,因此您不能将一个分配给另一个。
不要从 loadPostsList
内部调用 setState
。使用类似:
onRefresh: () async {
setState(() {
postsList = loadPostsList();
});
}
我正在尝试在未来的构建器上使用刷新指示器小部件实现拉动刷新操作。 我设法让它正确加载,但是当我尝试通过拉动刷新来刷新列表时,无法通过我当前面临的问题。
1.
late Future<QuerySnapshot> postsList;
- 初始化数据
void initState() {
super.initState();
postsList = loadPostsList();
}
- 从 firestore 函数加载数据
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
return data;
}
- 现在这就是我卡住的地方,我想将
setState(() => this.postsList = data);
添加到 loadPostsList() 函数中,如下所示:
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
// HERE
setState(() => this.postsList = data);
return data;
}
但出现此错误:
A value of type 'QuerySnapshot<Object?>' can't be assigned to a variable of type 'Future<QuerySnapshot<Object?>>'.
我是 Flutter 的新手并且还在学习:),因此感谢任何帮助:),下面是完整的代码:
final keyRefresh = GlobalKey<RefreshIndicatorState>();
late Future<QuerySnapshot> postsList;
@override
void initState() {
super.initState();
postsList = loadPostsList();
}
Future<QuerySnapshot> loadPostsList() async {
print('Refreshing Post List...');
keyRefresh.currentState?.show();
final QuerySnapshot data = await FirebaseFirestore.instance
.collection('Posts')
.orderBy('createdAt', descending: true)
.get();
return data;
}
FutureBuilder<QuerySnapshot>(
future: postsList,
builder: (context, snapshot) {
if (snapshot.hasData) {
final List<DocumentSnapshot> documents =snapshot.data!.docs;
return RefreshIndicator(
key: keyRefresh,
color: Colors.blue,
onRefresh: loadPostsList,
child: SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: documents.map((doc) => new PostCard(
author: doc['author'],
title: doc['title'],
description: doc['desc'],
),
).toList(),
),
);
} else if (snapshot.hasError) {
return Text('Error!');
} else {
return LoadingWidget();
}
},
),
错误是因为您将 data
定义为类型 QuerySnapshot
,并试图将其分配给您定义为类型 Future<QuerySnapshot>
的 postsList
。显然,它们是不同的类型,因此您不能将一个分配给另一个。
不要从 loadPostsList
内部调用 setState
。使用类似:
onRefresh: () async {
setState(() {
postsList = loadPostsList();
});
}