如何在小部件颤动中使用具有可见性的 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");
}