如何在小部件颤动中使用具有可见性的 FutureBuilder
how to use FutureBuilder with Visibility in a widget flutter
自从我试图弄清楚如何对隐藏帖子的用户隐藏帖子以来,已经有好几天了。我尝试使用 .where() 进行过滤,但后来我陷入了思考如何使用 userId 对其进行过滤的问题,它不在 firestore posts 集合的数组中。然后我尝试将规则设置为
match /reviews/{review}{
allow read: if request.auth != null && !(request.auth.uid in
resource.data.hidingUserId)}
但这并不奏效。没有收到任何帖子,因为权限被完全拒绝。
所以现在我正在尝试以下方法:
hidePost(BuildContext context) async {
setState(() {
isVisible = !isVisible;
});
await postRef.doc(widget.post.postId).update({'hidingUserId':
FieldValue.arrayUnion([FirebaseAuth.instance.currentUser.uid])});
showInSnackBar(context, Languages.of(context).postHidden);
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setBool("visibility", !isVisible);
}
getVisibility() async{
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool("visibility");
}
然后在我的小部件中我有:
child: Visibility(
visible: getVisibility(),
child: Container(
decoration: BoxDecoration(
color: Colors.white60,
borderRadius: BorderRadius.circular(15.0),
),
child: Column( blahblablah...)
我得到的错误是 type 'Future<dynamic>' is not a subtype of type 'bool'
在 getVisibility() 方法上。也许我需要使用 FutureBuilder,但我不知道在哪里使用它。请帮我解决这个问题?非常感谢!
在这种情况下,您将如何使用 FutureBuilder
:
child: FutureBuilder<bool?>(
future: getVisibility(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting)
// Return a widget to be used while the data
// is being loaded from the SharedPreferences
return Center(child: CircularProgressIndicator());
final bool? visibility = snapshot.data ?? false;
return Visibility(
visible: visibility,
child: Container(...),
);
}
)
题外话,但明确声明您的 return 类型以避免将来出现调试问题(无双关语意):
Future<bool?> getVisibility() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool("visibility");
}
自从我试图弄清楚如何对隐藏帖子的用户隐藏帖子以来,已经有好几天了。我尝试使用 .where() 进行过滤,但后来我陷入了思考如何使用 userId 对其进行过滤的问题,它不在 firestore posts 集合的数组中。然后我尝试将规则设置为
match /reviews/{review}{
allow read: if request.auth != null && !(request.auth.uid in
resource.data.hidingUserId)}
但这并不奏效。没有收到任何帖子,因为权限被完全拒绝。
所以现在我正在尝试以下方法:
hidePost(BuildContext context) async {
setState(() {
isVisible = !isVisible;
});
await postRef.doc(widget.post.postId).update({'hidingUserId':
FieldValue.arrayUnion([FirebaseAuth.instance.currentUser.uid])});
showInSnackBar(context, Languages.of(context).postHidden);
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setBool("visibility", !isVisible);
}
getVisibility() async{
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool("visibility");
}
然后在我的小部件中我有:
child: Visibility(
visible: getVisibility(),
child: Container(
decoration: BoxDecoration(
color: Colors.white60,
borderRadius: BorderRadius.circular(15.0),
),
child: Column( blahblablah...)
我得到的错误是 type 'Future<dynamic>' is not a subtype of type 'bool'
在 getVisibility() 方法上。也许我需要使用 FutureBuilder,但我不知道在哪里使用它。请帮我解决这个问题?非常感谢!
在这种情况下,您将如何使用 FutureBuilder
:
child: FutureBuilder<bool?>(
future: getVisibility(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting)
// Return a widget to be used while the data
// is being loaded from the SharedPreferences
return Center(child: CircularProgressIndicator());
final bool? visibility = snapshot.data ?? false;
return Visibility(
visible: visibility,
child: Container(...),
);
}
)
题外话,但明确声明您的 return 类型以避免将来出现调试问题(无双关语意):
Future<bool?> getVisibility() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool("visibility");
}