我有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(),
];
答案 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进行。