对 null 的 UID 调用和提供程序无法通过 TypeError 传递数据“FirebaseUser”类型不是“String”类型的子类型

问题描述

我尝试获取用户数据以确定管理员角色并将其传递给 Future Builder。根据管理员的不同,结果将决定哪个小部件是否可用。

enter image description here

              floatingActionButtonLocation:
                FloatingActionButtonLocation.centerDocked,floatingActionButton:
                  FutureBuilder(
  future: _getProfileData(user,authNotifier),builder: (context,snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              _isAdmin = snapshot.data['isAdmin'] ?? false;
            }
            return Container(
              child: Column(
                children: <Widget>[
                  adminFeature(),]
                  ));
          }),

下面的小部件提供有关用户的信息。

    Widget adminFeature() {
    if(_isAdmin == true) {
      return 
      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,);
            }),);
        });
    } else {
      return Container();
    }
  }

  _getProfileData(User user,AuthNotifier authNotifier) async {
    final uid = await Provider.of<AuthNotifier>(context,listen: false).getCurrentUser();
  await Firestore.instance
        .collection('Users')
        .document(uid)
        .get().then((result) {
          user.isAdmin = result.data['isAdmin'];
    });
  }

enter image description here

下面是提供者。它适用于所有应用程序,但我无法获取用户数据并将其传递给小部件。

    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => AuthNotifier(),),ChangeNotifierProvider(
          create: (context) => FoodNotifier(),ChangeNotifierProvider(create: (context) => ThemeProvider(isLightTheme: false)),ChangeNotifierProvider(create: (context) => UserxProvider()),ChangeNotifierProvider(create: (context) => UsersProvider()),],child: MyApp());
  }

下面提到了通知程序:

  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Future<String> getCurrentUID() async {
    return (await _firebaseAuth.currentUser()).uid;
  }

  // GET CURRENT USER
  Future getCurrentUser() async {
    return await _firebaseAuth.currentUser();
  }

解决方法

在您的 _getProfileData 方法中,您应该更改以下内容:

await Provider.of(context,listen: false) 

await Provider.of<UserxProvider>(context,listen: false) 
// or UsersProvider,whichever you're trying to call

问题在于,当您在未指定所需模型(即类型)的情况下调用 Provider 时,它会变为 Provider.of<dynamic>,因此您会收到该错误消息。