【问题标题】:how to use FutureBuilder with Visibility in a widget flutter如何在小部件颤动中使用具有可见性的 FutureBuilder
【发布时间】:2021-12-18 00:11:50
【问题描述】:

自从我试图弄清楚如何对隐藏它的用户隐藏隐藏的帖子已经有好几天了。我尝试使用 .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...)

我得到的错误是 getVisibility() 方法上的type 'Future<dynamic>' is not a subtype of type 'bool'。也许我需要使用 FutureBuilder,但我不知道在哪里使用它。请帮我解决这个问题?非常感谢!

【问题讨论】:

    标签: flutter sharedpreferences flutter-futurebuilder


    【解决方案1】:

    这就是在这种情况下您将如何使用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");
    }
    

    【讨论】:

    • 谢谢,@Enzo!我试过了,但是在布尔值上得到了空值......
    • 抱歉,看看我更新的答案是否能解决您的问题。
    • 谢谢你,恩佐。但我无法让 sharedpreferences 状态持续存在。现在尝试不同的方法。但是感谢您的帮助!
    猜你喜欢
    • 2021-07-19
    • 2023-03-06
    • 1970-01-01
    • 2021-07-12
    • 2021-11-28
    • 2022-12-14
    • 2021-04-19
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多