Flutter用户身份验证

时间:2020-06-24 10:19:15

标签: android ios firebase flutter authentication

我是新手,所以我需要一些帮助。我使用电话身份验证方法登录用户。现在,当用户成功登录后,我会收到以下错误:

enter image description here

这是我的完整代码:

import 'package:flutter/material.dart';
import 'package:neuroequlibrium/reusable.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class EditDetails extends StatefulWidget {
  @override
  _EditDetailsState createState() => _EditDetailsState();
}

class _EditDetailsState extends State<EditDetails> {
  final _firestore = Firestore.instance;
  final _auth = FirebaseAuth.instance;
  FirebaseUser loggedInUser;

  void getCurrentUser() async {
    final user = await _auth.currentUser();
    try {
      if (user != null) {
        loggedInUser = user;
        print(loggedInUser.phoneNumber);
      }
    } catch (e) {
      print(e);
    }
  }

  void initState() {
    // TODO: implement initState
    super.initState();

    getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Verify your details'),
      ),
      body: Center(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 50.0),
          child: Padding(
            padding: EdgeInsets.symmetric(
              horizontal: 0,
              vertical: 50.0,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisSize: MainAxisSize.max,
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                TextLabel('Name'),
                TextField(
                  onChanged: (value) {},
                  decoration: kInputStyle.copyWith(
                    hintText: 'Samyak',
                  ),
                ),
                SizedBox(height: 25.0),
                TextLabel('Date of birth'),
                TextField(
                  onChanged: (value) {},
                  decoration: kInputStyle.copyWith(hintText: '5/10/2003'),
                ),
                SizedBox(height: 25.0),
                TextLabel('Sex'),
                TextField(
                  onChanged: (value) {},
                  decoration: kInputStyle.copyWith(hintText: 'Male'),
                ),
                SizedBox(height: 25.0),
                TextLabel('Phone No.'),
                TextField(
                  onChanged: (value) {},
                  decoration:
                      kInputStyle.copyWith(hintText: loggedInUser.phoneNumber),
                ),
                SizedBox(height: 30.0),
                RoundedButton(
                  color: Colors.blueAccent,
                  text: 'Verify',
                  onPressed: () {
                    // Update Details & Redirect user
                    Navigator.pushNamed(context, 'additional_details1');
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

当我在initState()函数中运行getCurrentUser()时,我没有收到任何错误,并且用户编号已打印在控制台中。当我想在文本字段之一中将其显示为占位符时,如何引发上述异常。

此外,当我热加载我的应用程序时,它开始正常运行,并且数字显示在文本字段中,而无需更改代码。

注意:我正在使用Flutter和Android Studio进行开发

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是,当Flutter构建窗口小部件时,首先它会构建窗口小部件的状态,在这种状态下,您试图获取用户的号码,但是您仅在构建后才获取数字小部件-因此出现错误。当您热重装颤振时,会记住变量的数据,这就是为什么它能够更新UI。 为了解决此问题,可以进行2个修复:

(1)-首先调用getCurrentUser(),然后再构建小部件super.initState

(2)-构建对象时,检查变量的数据,如果为空,则显示另一个小部件。 getCurrentUser()完成后,使用setState((){})

更新小部件的状态

检查变量的一种简单方法是使用?格式,如下所示:

  int a = 5;
  a == 5 ? print('yes') : print('no');

输出显然是yes