【问题标题】:Admin role - user called null管理员角色 - 名为 null 的用户
【发布时间】:2021-01-03 09:24:26
【问题描述】:

每个用户都有一个分配给他们的管理员角色。显示或隐藏小部件需要此管理员角色。

我收到一条错误消息,提示管理员在 null 上被调用。

尽管获取了其他小部件的用户数据,但我没有从 firebase 正确接收到管理员角色的调用者。

  FirebaseUser currentUser;
  bool isAdmin= false;

    Widget adminFeature() {
    if(isAdmin == true) {
      return Text("You are an admin");
    } else {
      return Container();
    }
  }
  _getProfileData(User user,AuthNotifier authNotifier) async {
    final uid = await Provider.of(context).auth.getCurrentUID();
    await Provider.of(context)
        .db
        .collection('userData')
        .document(uid)
        .get().then((result) {
          user.isAdmin = result.data['isAdmin'];
    });
  }
              floatingActionButtonLocation: 
                FloatingActionButtonLocation.centerDocked,
                  floatingActionButton:
                  FutureBuilder(
          future: _getProfileData(user, authNotifier),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              isAdmin = user.isAdmin ?? false;
            }
            return Container(
              child: Column(
                children: <Widget>[
                  FloatingActionButton(
                    backgroundColor:CompanyColors.blue[500],
                          child: const Icon(Icons.add),onPressed: () {
                              var foodNotifier = Provider.of<FoodNotifier>(context, listen: false);
                    foodNotifier.currentFood = null;
          Navigator.of(context).push(
            MaterialPageRoute(builder: (BuildContext context) {
              return FoodForm(
                isUpdating: false,
              );
            }),
          );
        },
      ),
      adminFeature(),]

【问题讨论】:

  • 在 _getProfileData 中然后使用 setState 函数并将 isAdmin 设置为 true
  • 谢谢 Benzo,你会把 setState 放在哪里?
  • 我假设您正在使用 Statefull 小部件?您可以设置新的变量数据,它将保存来自 API 调用的数据。在有状态的小部件中,您有方法 initState()。在这个函数中,你将调用你的函数 _getProfileData 来填充数据变量。这样您就可以避免使用空变量,因为在构建它时会立即填充 vars。

标签: firebase flutter firebase-authentication admin


【解决方案1】:

试试:

  _getProfileData(User user,AuthNotifier authNotifier) async {
    final uid = await Provider.of(context).auth.getCurrentUID();
    return await Provider.of(context)
        .db
        .collection('userData')
        .document(uid)
        .get();
  }

然后在FutureBuilder:

  future: _getProfileData(user, authNotifier),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              isAdmin = snapshot.data['isAdmin'] ?? false;
            }

从方法返回结果并将result.data['isAdmin']分配给isAdmin变量。

【讨论】:

  • FullBuilder 出现错误,在 Null 上调用了 getter Admin。
  • 是的,因为 user 为空,我在代码中删除了它
  • 这是新的错误消息:方法 '[]' 在 null 上被调用。接收方:null 尝试调用:[]("isAdmin")
  • getProfileData() 中做print(uid) 和在if 子句中做print(snapshot.data)
  • W/ProviderInstaller(25213):无法加载 providerinstaller 模块:找不到可接受的模块。本地版本为 0,远程版本为 0。 D/NetworkSecurityConfig(25213):未指定网络安全配置,使用平台默认 I/ProviderInstaller(25213):安装默认安全提供程序 GmsCore_OpenSSL D/ConnectivityManager(25213):requestNetwork; CallingUid : 10325, CallingPid : 25213 D/FirebaseAuth(25213): 通知 id 令牌侦听器有关用户 ( kVfWOsHSbWhxFDeIqP6Gj8wXVKf1 )。
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 2016-01-24
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多