【问题标题】:firebase user number is showing nullfirebase 用户号显示为空
【发布时间】:2020-01-06 16:42:52
【问题描述】:

我想在屏幕上显示用户电话号码,但屏幕上显示为空

String _userId;

  @override
  Widget build(BuildContext context) {
    FirebaseAuth.instance.currentUser().then((user) {
      _userId = user.phoneNumber;
    });
    print(_userId);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Container(
                child:  Text("$_userId")
                    ?? CircularProgressIndicator(),

【问题讨论】:

    标签: firebase flutter dart firebase-authentication


    【解决方案1】:

    您需要将 Firebase 查询移到构建方法之外。 build 方法会随着 Widget 的重建而不断运行。理想情况下,您会以这种方式实现它:

    // _userId needs to be initiated with a blank value
    String _userId = '';
    
    @override
    void initState() {
      loadCurrentUser();
      super.initState();
    }
    
    void loadCurrentUser(){
      FirebaseAuth.instance.currentUser().then((user) {
        setState(() {
          _userId = user.phoneNumber;
        });
      });
    }
    

    这样,一旦加载信息,您的视图就会更新。

    【讨论】:

    • loadcurrentuser() 是什么意思,我没明白,说这个方法没有为我的班级定义
    • 是我在initState下面写的方法,你把整个代码都复制了吗?
    • 如果这解决了您的问题,请将其标记为正确答案。它将帮助未来的用户找到他们的答案。
    【解决方案2】:

    您需要使用FutureBuilder,FutureBuilder 小部件随 Flutter 一起提供,可以轻松处理异步数据源。因此,您需要执行以下操作:

     @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(),
            body: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  Container(
                    child : FutureBuilder(
                      future: FirebaseAuth.instance.currentUser(),
                      builder: (context, snapshot) {
                              if (snapshot.hasData) {
                                   print(snapshot);
                        return Text(snapshot.data.uid);
                        }
                        // By default, show a loading spinner.
                        return CircularProgressIndicator();
                      }
                    )
    

    future 属性将包含此构建器当前连接到的异步计算,可能为 null。你也应该使用Stateful Widget。

    【讨论】:

    • 很酷的答案,因为我以前从未听说过FutureBuilder(只有StreamBuilder)。
    【解决方案3】:

    您应该显示更多代码,但您似乎正在使用 StatelessWidget,这意味着在 Future 返回后,构建方法中 _userId 的值不会自行更新。最简单的方法是使用 StatefulWidget 并在 Future 中调用 setState 来更新值。

    由于同样的问题,您的行 Text("$_userId")?? CircularProgressIndicator() 也将无法正常工作,但您需要根据 _userId 的值显示一个或另一个小部件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多