Flutter: не удалось получить доступ к свойствам класса в виджете сборки с подключением к Firebase

#firebase #flutter #dart

#firebase #сбой #dart

Вопрос:

Каждый раз, когда я пытаюсь использовать свойство loggegInUser, оно возвращает null, пожалуйста, помогите мне решить эту проблему, методы GetCurrent () работают должным образом и выводят адрес электронной почты пользователя и пароль, но я не могу получить доступ к этим переменным в Build Widget.

 class _ProfilePageState extends State<ProfilePage> {
      final _auth = FirebaseAuth.instance;
      FirebaseUser loggedInUser;
      String uid;
      var url;
      var userProfilePhotoUrl;
    
      int currentPageIndex = 2;
      CircularBottomNavigationController _navigationController =
          new CircularBottomNavigationController(2);
    
      List<TabItem> tabItems = List.of([
        new TabItem(Icons.home, "Home", Colors.blue,
            labelStyle: TextStyle(fontWeight: FontWeight.normal)),
        new TabItem(Icons.add, "Let's Party", Colors.orange,
            labelStyle: TextStyle(color: Colors.red, fontWeight: FontWeight.bold)),
        new TabItem(Icons.person, "Reports", Colors.red),
      ]);
    
      @override
      void initState() {
        super.initState();
        getCurrentUser();
      }
    
      void getCurrentUser() async {
        try {
          final user = await _auth.currentUser();
          if (user != null) {
            loggedInUser = user;
            uid = user.uid;
            print(loggedInUser.email);
            print(uid);
          }
        } catch (e) {
          print(e);
        }
      }
    
      void changePage(int index) {
        setState(() {
          currentPageIndex = index;
        });
      }
    
      Future<FirebaseImage> getFirebaseProfilPhoto() async {
        try {
          final user = await _auth.currentUser();
          if (user != null) {
            loggedInUser = user;
            uid = user.uid;
            print(loggedInUser.email);
            print(uid);
            return FirebaseImage(
                'gs://homeparty-68792.appspot.com/user_profile_images/${loggedInUser.uid}.png');
          }
        } catch (e) {
          print(e);
        }
      }
    
      @override
      Widget build(BuildContext context) {
        setState(() {
          getCurrentUser();
        });
        return Scaffold(
          appBar: AppBar(
            title: Text('furkanakguun'),
          ),
          body: Builder(
            builder: (context) => Container(
              color: Colors.black,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  SizedBox(
                    height: 20.0,
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      CircleAvatar(
                        backgroundColor: Colors.black,
                        backgroundImage: FirebaseImage(
                            'gs://homeparty-68792.appspot.com/user_profile_images/${loggedInUser.uid}.png'),
                        // FirebaseImage(
                        //     'gs://homeparty-68792.appspot.com/user_profile_images/$uid.png'),
                        //backgroundImage: Image.network(userProfilePhotoUrl),
                        radius: 100,
                      ),
                      Padding(
                        padding: EdgeInsets.only(top: 60.0),
                        child: IconButton(
                          icon: Icon(
                            FontAwesomeIcons.camera,
                            size: 30.0,
                          ),
                          focusColor: Colors.white,
                          color: Colors.deepPurple,
                          onPressed: () {
                            print('asd');
                            Navigator.pushNamed(context, 'image_uploader');
                          },
                        ),
                      ),
                    ],
                  ),
                  Divider(),
                  SizedBox(
                    height: 20.0,
                  ),
                  Row(
                    children: <Widget>[
                      Card(
                        color: Colors.grey[900],
                        margin: EdgeInsets.symmetric(horizontal: 10.0),
                        child: Icon(Icons.person),
                      ),
                      Card(
                        color: Colors.grey[900],
                        margin:
                            EdgeInsets.symmetric(horizontal: 10.0, vertical: 7.0),
                        child: Container(
                          child: Column(
                            children: <Widget>[
                              Align(
                                alignment: Alignment.centerLeft,
                                child: Text('Furkan Akgün',
                                    style: TextStyle(
                                        color: Colors.white,
                                        fontSize: 20.0,
                                        fontWeight: FontWeight.bold)),
                              ),
                            ],
                          ),
                        ),
                      ),
                    ],
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  Row(
                    children: <Widget>[
                      Card(
                        color: Colors.grey[900],
                        margin: EdgeInsets.symmetric(horizontal: 10.0),
                        child: Icon(Icons.location_on),
                      ),
                      Card(
                        color: Colors.grey[900],
                        margin:
                            EdgeInsets.symmetric(horizontal: 10.0, vertical: 7.0),
                        child: Container(
                          child: Column(
                            children: <Widget>[
                              Align(
                                alignment: Alignment.centerLeft,
                                child: Text('Ankara',
                                    style: TextStyle(
                                        color: Colors.white,
                                        fontSize: 20.0,
                                        fontWeight: FontWeight.bold)),
                              ),
                            ],
                          ),
                        ),
                      ),
                    ],
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  Row(
                    children: <Widget>[
                      Card(
                        color: Colors.grey[900],
                        margin: EdgeInsets.symmetric(horizontal: 10.0),
                        child: Icon(Icons.rate_review),
                      ),
                      Card(
                        color: Colors.grey[900],
                        margin:
                            EdgeInsets.symmetric(horizontal: 10.0, vertical: 7.0),
                        child: Container(
                            child: SmoothStarRating(
                          spacing: 2.0,
                          allowHalfRating: true,
                          starCount: 5,
                          rating: 4.5,
                          size: 20,
                          color: Colors.yellow,
                          borderColor: Colors.white,
                          isReadOnly: true,
                        )),
                      ),
                    ],
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  SizedBox(
                    height: 40.0,
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[
                      RaisedButton(
                        color: Colors.deepPurple[900],
                        onPressed: () {
                          //uploadPic(context);
                        },
                        elevation: 4.0,
                        splashColor: Colors.blueGrey,
                        child: Text(
                          'Edit',
                          style: TextStyle(color: Colors.white, fontSize: 16.0),
                        ),
                      ),
                    ],
                  )
                ],
              ),
            ),
          ),
          bottomNavigationBar: CircularBottomNavigation(
            tabItems,
            barBackgroundColor: Colors.deepPurple[900],
            controller: _navigationController,
            selectedCallback: (int selectedPos) {
              if (selectedPos == 0) {
                Navigator.pushNamed(context, 'dashboard_screen');
              }
              if (selectedPos == 2) {
                Navigator.pushNamed(context, 'user_profile');
              }
            },
          ),
        );
      }
    }
  

введите описание изображения здесь

Произошло исключение ТИПА ОШИБКИ. Ошибка NoSuchMethodError (Ошибка NoSuchMethodError: средство получения ‘uid’ было вызвано в null. Получатель: null Пытался вызвать: uid)

Комментарии:

1. в какой строке вы получаете исключение?

2. верните FirebaseImage( ‘gs://homeparty-68792.appspot.com/user_profile_images /${loggedInUser.uid}.png’); } В этой строке, когда я пытаюсь достичь loggedInUser.uid, он возвращает null

3. Но loggedInUser.email печатает электронное письмо??

4. Да, он печатает. Метод getCurrentUser() работает должным образом

Ответ №1:

Я предполагаю, что ошибка возникает из этого кода в вашем build методе:

 FirebaseImage('gs://homeparty-68792.appspot.com/user_profile_images/${loggedInUser.uid}.png')
  

Это связано с тем, что пользовательский интерфейс может быть создан до завершения входа пользователя.

Чтобы этого не произошло, вам необходимо учесть тот факт, что пользователь может не входить в систему, в вашем build коде тоже, например, пропустив рендеринг изображения его профиля:

 backgroundImage: loggedInUser != null ? 
                    FirebaseImage('gs://homeparty-68792.appspot.com/user_profile_images/${loggedInUser.uid}.png') : 
                    Text("Loading...")
  

Комментарии:

1. Я написал ваш код, я не получаю никаких ошибок, но фотографии пользователя никогда не загружаются.

2. Это другая проблема. Я не уверен, что FirebaseImage делает, и может ли оно обрабатывать gs:// URL-адреса. Я бы рекомендовал опубликовать новый вопрос для этой части, поскольку та же проблема возникнет с изображением, не относящимся к конкретному пользователю, в то время как проблема, которую я рассмотрел здесь, заключается в том, что состояние пользователя определяется асинхронно.

3. Есть ли какой-либо способ загрузить изображение из firebase с текущим uid пользователя, я думаю, что опубликую новый вопрос по этому поводу.