首页 > 解决方案 > 如何在小部件颤动中使用具有可见性的 FutureBuilder

问题描述

自从我试图弄清楚如何对隐藏它的用户隐藏隐藏的帖子已经有好几天了。我尝试使用 .where() 进行过滤,但后来我陷入了思考如何使用 userId 过滤它的问题,该 userId 不在 firestore 帖子集合的数组中。然后我尝试将规则设置为

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,但我不知道在哪里使用它。请帮我解决这个问题?非常感谢!

标签: fluttersharedpreferencesflutter-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(...),
    );
  }
)

题外话,但明确声明您的返回类型以避免将来出现调试问题(没有双关语):

Future<bool?> getVisibility() async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getBool("visibility");
}

推荐阅读