我正在尝试实现一个简单的注册页面。以下是我的 main.dart 代码:
主程序.dart
void main() async {
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<MyUser>.value(
value: AuthService().user,
initialData: null,
child: MaterialApp(
home: Wrapper(),
debugShowCheckedModeBanner: false,
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
我在线上看到此错误initialData: null,:
The argument type 'Null' can't be assigned to the parameter type 'MyUser'.
这是我的 MyUser 类:
用户.dart
class MyUser {
final String uid;
MyUser({this.uid});
}
Run Code Online (Sandbox Code Playgroud)
它向我显示了第 3 行 uid 上的以下错误:
The parameter 'uid' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
Try adding either an explicit non-'null' default value or the 'required' modifier.
Run Code Online (Sandbox Code Playgroud)
我对颤振开发相当陌生,所以我不确定这意味着什么以及如何解决它。我无法在网上找到任何相关帮助。任何帮助将不胜感激。
编辑1:
整个auth.dart文件:
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
// create user obj based on firebase user
MyUser? _userFromFirebaseUser(User user) {
// ignore: unnecessary_null_comparison
return user != null ? MyUser(uid: user.uid) : null;
}
// auth change user stream
Stream<MyUser> get user {
return _auth.authStateChanges()
//.map((FirebaseUser user) => _userFromFirebaseUser(user));
.map(_userFromFirebaseUser);
}
// sign in with email and password
Future signInWithEmailAndPassword(String email, String password) async {
try {
UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
User? user = result.user;
return _userFromFirebaseUser(user!);
} catch (error) {
print(error.toString());
return null;
}
}
// register with email and password
Future registerWithEmailAndPassword(String email, String password) async {
try {
UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
User? user = result.user;
return _userFromFirebaseUser(user!);
} catch (error) {
print(error.toString()+"oollala");
return null;
}
}
// sign out
Future signOut() async {
try {
return await _auth.signOut();
} catch (error) {
print(error.toString());
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误在于:
Stream<MyUser> get user {
return _auth.authStateChanges()
.map(_userFromFirebaseUser);
}
Run Code Online (Sandbox Code Playgroud)
它向我显示了一个错误_userFromFirebaseUser
The argument type 'MyUser? Function(User)' can't be assigned to the parameter type 'MyUser Function(User?)'.
您将属性定义uid为不可为空String,但在构造函数中将其声明为可选值,因为这意味着如果未分配,{}它将具有默认值。null
要修复此错误,您需要uid在构造函数中将其设置为非可选:
MyUser(this.uid);
Run Code Online (Sandbox Code Playgroud)
或者将其设为必需参数:
MyUser({required this.uid});
Run Code Online (Sandbox Code Playgroud)
如果您打算这样做,uid那么null您需要像这样声明您的变量:
final String? uid; // this is a nullable String variable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5216 次 |
| 最近记录: |