dart - 如何解决“参数类型‘Null’无法分配给参数类型‘MyUser’。”

hek*_*k18 3 dart flutter

我正在尝试实现一个简单的注册页面。以下是我的 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?)'.

Gui*_*oux 5

您将属性定义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)