Flutter - Ошибка аутентификации Firebase и аутентификации по электронной почте - PullRequest
1 голос
/ 07 мая 2020

Я создаю код входа через firebase. Я хочу войти в систему только для пользователя, который зарегистрировался и сертифицировал по электронной почте и настроил его так, чтобы он мог автоматически входить в систему. Создал код с помощью streambuilder для автоматического входа c. Однако автоматическая c ошибка аутентификации электронной почты для входа возникает, когда получатель равен нулю. Есть ли способ поставить трубку? Или я был бы признателен, если бы вы сказали мне, как ее решить.

import 'dart:io';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutteridmemo/pages/log_in_page.dart';
import 'package:flutteridmemo/pages/memo_page.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Directory document = await getApplicationDocumentsDirectory();
  Hive.init(document.path);
  await Hive.openBox<String>("DB");
  runApp(MyApp());
}

bool isFirstData = true;

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FirebaseUser _firebaseUser;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        canvasColor: Colors.transparent,
      ),
      title: 'ID_Memo_Memo',
      home: StreamBuilder<FirebaseUser>(
        stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (context, snapshot) {
          if (isFirstData) {
            isFirstData = false;
            return Center(
              child: CircularProgressIndicator(),
            );
          } else {
            if (snapshot.hasData && _firebaseUser.isEmailVerified == true) {
              return MemoPage();
            } else {
              return LogInPage();
            }
          }
        },
      ),
    );
  }
}

Это ошибка.

I/flutter (14699): The following NoSuchMethodError was thrown building             
StreamBuilder<FirebaseUser>(dirty, state:
I/flutter (14699): _StreamBuilderBaseState<FirebaseUser,         
AsyncSnapshot<FirebaseUser>>#963d7):
I/flutter (14699): The getter 'isEmailVerified' was called on null.
I/flutter (14699): Receiver: null
I/flutter (14699): Tried calling: isEmailVerified
I/flutter (14699): 
I/flutter (14699): The relevant error-causing widget was:
I/flutter (14699):   StreamBuilder<FirebaseUser> enter code here

Ответы [ 2 ]

1 голос
/ 07 мая 2020

'isEmailVerified' был вызван с нулевым значением, значит, _firebaseUser имеет значение NULL. Вы не инициализировали _firebaseUser, поскольку вы используете FirebaseAuth.instance.onAuthStateChanged внутри StreamBuilder, он должен возвращать Stream<FirebaseUser>, поэтому вы должны использовать переменную snapshot, которая имеет тип AsyncSnapshot<FirebaseUser>, чтобы проверить, подтвержден ли адрес электронной почты или нет.

 else {
            if (snapshot.hasData &&snapshot.data.isEmailVerified == true) {
              return MemoPage();
            } else {
              return LogInPage();
            }
1 голос
/ 07 мая 2020

Так это происходит, даже если снимок не содержит данных, т.е. даже если он равен нулю, вы пытаетесь вызвать isEmailVerified для него. Измените свой код на что-то подобное:

if (snapshot.hasData) {
  if(_firebaseUser.isEmailVerified == true){
    return MemoPage();
  }
}else{
    return LogInPage();
}
...