未定义名称的用户

时间:2020-07-22 14:35:01

标签: flutter dart

我有3个屏幕,登录,主页和聊天。在聊天中,我想使用用户,但是由于某些原因,我遇到了错误。

尝试将用户传递到聊天室时,HomePage类出错:'Undefined name'user'。

以下代码示例:

class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  String email;
  String password;

  final FirebaseAuth _auth = FirebaseAuth.instance;

  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  
  Future<String> login(String _email, String _password) async {
    FirebaseUser user = (await _firebaseAuth.signInWithEmailAndPassword(
            email: _email, password: _password))
        .user;
    () =>
        Navigator.push(context, MaterialPageRoute(builder: (context) => Bar(user: user)));
  }
 ...

为什么未定义?我想将 user 从Login()通过Homepage()传递到Chat()。 预先谢谢你

编辑: 我注意到它不仅在List中定义,而且还可以正常工作。 如何将其传递给列表?

class HomePage extends StatefulWidget {
  final FirebaseUser user;

  const HomePage({Key key, this.user}) : super(key:key);

  @override
  _BarState createState() => _BarState();
}


class _BarState extends State<HomePage> {

  void test() {
    () =>
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => 
Chat(user: widget.user))); < ---- WORKING
  }

  int tabIndex = 0;
  List<Widget> widgetOptions = [
    Match(),
    Chat(user: widget.user), < --- NOT WORKING
    AddBook(),
    Profile(),
  ];

3 个答案:

答案 0 :(得分:1)

您要在其他屏幕上访问用户对象,而不是在cconstructor中传递它,而是创建一个单例类,就像这样

class AuthUser {
  static var authUserId;
  static var email;
  static var userName;
  static var role;
  static var companyId;
} 

在登录期间设置像这样的值,请在此处检查print(user);和分别设置值

Future<String> login(String _email, String _password) async {
    FirebaseUser user = (await _firebaseAuth.signInWithEmailAndPassword(
            email: _email, password: _password))
        .user;
    () =>
AuthUser.email = user.email,
AuthUser.email = user.userName,
..........
       ));
  }

在其他屏幕中访问数据,例如AuthUser.email,AuthUser.userName .....

答案 1 :(得分:0)

改为使用聊天(用户:widget.user)。

答案 2 :(得分:0)

当您使用有状态的小部件以及如何从构造函数中获取属性时,您需要这样做:

def showDialog(): msgBox = QMessageBox() msgBox.setFont(defaultfont) msgBox.setIcon(QMessageBox.Information) msgBox.setText("Message box pop up window") msgBox.setWindowTitle("QMessageBox Example") msgBox.buttonClicked.connect(msgButtonClick) for label in msgBox.findChildren(QtWidgets.QLabel): label.setMinimumWidth(200) returnValue = msgBox.exec_() if returnValue == QMessageBox.Ok: print("OK clicked")

大多数情况下并不需要它,但是如果您想将其分配给状态下的新变量,则可以在initState进行。