【问题标题】:Flutter build different widgets when a function returns true当函数返回 true 时,Flutter 构建不同的小部件
【发布时间】:2021-08-23 21:20:36
【问题描述】:

我有一个用户可以在其中创建事件的视图,如果用户创建事件,则通过共享首选项保存一个值,该值确定用户是否是管理员。如果用户现在进入视图,无论用户是管理员还是访客,构建小部件都应该构建不同的小部件。我有一个功能可以检查用户是管理员还是访客。但是整个事情还不能正常工作,并且没有构建正确的小部件。 也许我犯了一个愚蠢的错误,或者这不是最佳做法,我将不胜感激每一点帮助!

这是我的构建方法

@override
  Widget build(BuildContext context) {
    return checkifadmin() != null ? buildGuestView() : buildAdminView();
  }

这是我的函数,检查它是否是管理员

Future<bool> checkifadmin() async {
    final prefs = await SharedPreferences.getInstance();
    final myevent = prefs.getString('event');
    if (myevent == widget.eventName) {
      print('Your are admin');
      return true;
    } else {
      print('you are a guest');
      return false;
    }
  }

该功能完美运行,始终可以正确识别。问题可能出在构建方法上

当我将 BuildGuestView 更改为:

 return checkifadmin() != null ? buildAdminView() : buildGuestView(); 

buildadminview 总是在构建。

【问题讨论】:

    标签: flutter build widget sharedpreferences


    【解决方案1】:
     return await checkifadmin() ? buildAdminView() : buildGuestView();
    

    【讨论】:

    • 感谢您的回答。我也已经尝试过了,但是我的构建小部件必须是异步的才能使用等待操作,我不能这样做。
    • @Overide InitState() 函数并在那里调用您的异步函数以加载首选项。最初建立一个圆形进度指标。加载首选项后,调用 setState() 以管理员或访客身份重建您的小部件。或者只是使用 FutureBuilder 并在那里加载首选项。
    • 感谢您的帮助!对我帮助很大
    【解决方案2】:

    你应该使用FutureBuilder:

    FutureBuilder<bool>(
      future: checkIfAdmin(),
      builder: (_, snapshot) {
        final hasData = snapshot.data ?? false;
        return hasData ? buildAdminView() : buildGuestView();
      },
    )
    

    【讨论】:

    • 感谢您的回答!我得到了使用 FutureBuilder 的代码!
    猜你喜欢
    • 2021-01-11
    • 2020-01-22
    • 2020-10-23
    • 2021-09-30
    • 2019-10-19
    • 1970-01-01
    • 2021-01-14
    • 2019-07-31
    • 2020-08-08
    相关资源
    最近更新 更多