显示未来列表函数 Firebase GetX
Displaying a Future List Function Firebase GetX
我正在尝试创建一个用户源,就像使用 Firebase 和 GetX 的 Twitter 一样。
在代码片段中是我的函数..
List<PostModel> postListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
return PostModel(
id: doc.id,
text: (doc.data() as dynamic)["text"] ?? "",
creator: (doc.data() as dynamic)["creator"] ?? "",
timestamp: (doc.data() as dynamic)["timestamp"] ?? 0,
);
}).toList();
}
Future<List<PostModel>> getFeed() async {
List<String> usersFollowing = await UserService() //['uid1', 'uid2']
.getUserFollowing(FirebaseAuth.instance.currentUser!.uid);
QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("posts").where('creator', whereIn: usersFollowing)
.orderBy('timestamp', descending: true)
.get();
return postListFromSnapshot(querySnapshot);
}
我想做的是显示 Future 函数 getFeed(),我使用 GetX 进行状态管理。所以,我的问题是如何使用 ListView.Builder()
显示此函数的结果
以下是我使用 Future 构建器的方式
FutureBuilder(
future: _.listPost,
initialData: [PostModel(id: "2", creator: "Fm", text: "Testing", timestamp: Timestamp.now())],
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.hasData == null){
return Text("Data is available");
} else{
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.toString().length,
itemBuilder: (context, index){
PostModel posts = snapshot.data[index];
return Column(
children: [
Text(posts.text)
],
);
},
);
}
},
)
这是我得到的错误
The following NoSuchMethodError was thrown building:
The method '[]' was called on null.
Receiver: null
Tried calling: [](3)
它还指出了
上的一个错误
PostModel post 行.. 准确地说是 [index]
首先,将您的 AsyncSnapshot snapshot
设为 AsyncSnapshot<List<PostModel>> snapshot
。这不是你的主要问题,但它会让事情变得更容易正确打字,而不必猜测使用 dynamic
.
你的问题是 hasData
是 bool
。它要么是 true
要么是 false
,但绝不是 null
。我想知道你是如何通过你的编译器得到那一行的。您使用的是过时版本的 Flutter 吗?你应该检查一下,你的编译器是你的朋友,如果它不能正确地帮助你,这将是一条艰难而崎岖的道路。
反正你先看看有没有数据,如果有none,你还在等:
FutureBuilder(
future: _.listPost,
builder: (BuildContext context, AsyncSnapshot<List<PostModel>> snapshot){
if(!snapshot.hasData){
return CircularProgressIndicator();
} else {
final postList = snapShot.requireData;
return ListView.builder(
shrinkWrap: true,
itemCount: postList .length,
itemBuilder: (context, index){
final post = postList[index];
return Column(
children: [
Text(post.text)
],
);
},
);
}
},
)
我正在尝试创建一个用户源,就像使用 Firebase 和 GetX 的 Twitter 一样。
在代码片段中是我的函数..
List<PostModel> postListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
return PostModel(
id: doc.id,
text: (doc.data() as dynamic)["text"] ?? "",
creator: (doc.data() as dynamic)["creator"] ?? "",
timestamp: (doc.data() as dynamic)["timestamp"] ?? 0,
);
}).toList();
}
Future<List<PostModel>> getFeed() async {
List<String> usersFollowing = await UserService() //['uid1', 'uid2']
.getUserFollowing(FirebaseAuth.instance.currentUser!.uid);
QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("posts").where('creator', whereIn: usersFollowing)
.orderBy('timestamp', descending: true)
.get();
return postListFromSnapshot(querySnapshot);
}
我想做的是显示 Future 函数 getFeed(),我使用 GetX 进行状态管理。所以,我的问题是如何使用 ListView.Builder()
显示此函数的结果以下是我使用 Future 构建器的方式
FutureBuilder(
future: _.listPost,
initialData: [PostModel(id: "2", creator: "Fm", text: "Testing", timestamp: Timestamp.now())],
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.hasData == null){
return Text("Data is available");
} else{
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.toString().length,
itemBuilder: (context, index){
PostModel posts = snapshot.data[index];
return Column(
children: [
Text(posts.text)
],
);
},
);
}
},
)
这是我得到的错误
The following NoSuchMethodError was thrown building:
The method '[]' was called on null.
Receiver: null
Tried calling: [](3)
它还指出了
上的一个错误
PostModel post 行.. 准确地说是 [index]
首先,将您的 AsyncSnapshot snapshot
设为 AsyncSnapshot<List<PostModel>> snapshot
。这不是你的主要问题,但它会让事情变得更容易正确打字,而不必猜测使用 dynamic
.
你的问题是 hasData
是 bool
。它要么是 true
要么是 false
,但绝不是 null
。我想知道你是如何通过你的编译器得到那一行的。您使用的是过时版本的 Flutter 吗?你应该检查一下,你的编译器是你的朋友,如果它不能正确地帮助你,这将是一条艰难而崎岖的道路。
反正你先看看有没有数据,如果有none,你还在等:
FutureBuilder(
future: _.listPost,
builder: (BuildContext context, AsyncSnapshot<List<PostModel>> snapshot){
if(!snapshot.hasData){
return CircularProgressIndicator();
} else {
final postList = snapShot.requireData;
return ListView.builder(
shrinkWrap: true,
itemCount: postList .length,
itemBuilder: (context, index){
final post = postList[index];
return Column(
children: [
Text(post.text)
],
);
},
);
}
},
)