【问题标题】:Flutter - How to return a value from function to a variableFlutter - 如何将值从函数返回到变量
【发布时间】:2020-11-18 04:55:38
【问题描述】:

我正在尝试从 Firebase 检索 UID 并将其返回给变量。但是我无法让它工作。有人可以帮忙吗?谢谢

getUID() async {
    final userId = await widget.auth.getCurrentUser();
    print('checking user id ${userId.uid}');
    return userId.uid;
}

@override
void initState() {
  super.initState();
  void foo() async {
    final userID = await getUID();
    print("UID is ${userID}");
  }
  foo();
  print("UID is ${userID}");
}

【问题讨论】:

  • 定义“无法正常工作”,你遇到了什么错误?这些错误发生在哪一行?当您使用调试器进行检查时会发生什么?
  • 道歉。当我尝试按最后一行中所示的方式打印它时,它说 userID 未定义。我需要从 foo 函数外部获取值以传递给其他页面。
  • 请添加getcurrentuser的代码
  • 这是 auth.dart 文件中 getCurrentUser 的代码 Future getCurrentUser() async { FirebaseUser user = await _firebaseAuth.currentUser();返回用户; }
  • Asnwered,如果出现问题,请发表评论

标签: flutter async-await


【解决方案1】:

您遇到的问题是scope。您在内部函数foo 中声明userId,因此该变量在foo 之外不存在。如果要在initState范围内访问,需要在该范围内声明:

@override
void initState() {
  super.initState();
  String userId;

  void foo() async {
    userID = await getUID();
    print("UID is ${userID}");
  }

  foo();
  print("UID is ${userID}");
}

【讨论】:

  • 在调用 foo() 函数并尝试打印后显示为“UID 为空”。虽然在 foo 函数内部,值被打印出来,但不能在外面得到。
  • @RaghuCK 问题是foo 被标记为async,但是当你调用foo 时,你不会await 它。这会导致initState 轻而易举地通过它而不等待结果。通常我会说只是让 initState 异步,但在这种情况下,Flutter 不允许你这样做,因为所有 async 函数都返回 Future 并且 initState 必须返回 void
  • 谢谢。您能否帮助如何将 userID 值转换为变量,以便我可以传递到其他页面。否则请告诉我如何从 firebase 获取用户的 uid。
  • @RaghuCK 将它放在一个单独的函数中,您可以标记为async。然后你可以在fooawait 并将结果设置为你想要的变量。尽管在这种情况下,foo 单独的函数,并且用户ID 确实来自getUID
【解决方案2】:

在每个类之外声明这个

String getCurrentUser(){
return FirebaseAuth.instance.currentUser;
}

你使用它的类应该是

class RootPage extends StatefulWidget {

@override
State<StatefulWidget> createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
String _userId;

@override
void initState() {
super.initState();
_userId=getCurrentUser();
}

@override
Widget build(BuildContext context) {
return Text(_userId==null?"NO User Logged In":_userId);
}

另请注意,最新版本的 firebaseauth 此函数不再返回未来;

【讨论】:

    【解决方案3】:
    /// Create a String variable to hold the value of the user UID
    String userId; 
    
    void getCurrentUser() {
    try {
      User loggedInUser = _auth.currentUser;
      if (loggedInUser != null) {
        userId = loggedInUser.uid;
      }
    } catch (e) {
      print(e.toString());
    }
    

    }

    @override
    void initState() {
      super.initState();
      getCurrentUser(); // The code to get the currrent user is run in the initState and user UID stored in the 'userId' variable
    
    }
    

    您现在可以在当前班级的任何地方访问当前登录的用户 UID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多