繁体   English   中英

Flutter 用户认证

[英]Flutter User Auth

我是 flutter 的新手,因此我需要一些帮助。 我使用电话验证方法登录用户。 现在,当用户成功登录时,我收到以下错误:

在此处输入图像描述

这是我的完整代码:

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() function 中运行 getCurrentUser() 时,我没有收到任何错误,并且用户的号码会打印在控制台中。 当我想在其中一个文本字段中将其显示为占位符时,如何引发上述异常。

此外,当我热重新加载我的应用程序时,它开始完美运行,并且数字显示在文本字段中,无需对代码进行任何更改。

注意:我使用 flutter 和 android studio 进行开发

任何帮助将非常感激!

发生这种情况的原因是因为当 Flutter 构建小部件时,首先它构建小部件的 state,在那个 state 中,你试图在你试图获取用户的号码之后获取用户的号码因此错误。 当你热重载 flutter 会记住变量的数据,这就是它能够更新 UI 的原因。 为了解决此问题,可以进行 2 个修复:

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

(2) - 在构建 object 时检查变量的数据,如果它是 null,则显示不同的小部件。 getCurrentUser()完成时,使用setState((){})更新小部件的 state

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

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

output 显然yes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM