当我尝试更新用户个人资料时,我不断收到调用 null 的 getter

问题描述

您好,我是 Flutter 新手,我正在尝试为登录用户一个简单的用户配置文件屏幕,但我偶然发现了一些错误,第一个是当我尝试使用 StreamBuilder(),其中流没有从 UserProvider() 中的 getter 获取任何数据(这是我放置 BL 的地方)它一直说 getCurrentUserData() 在 null 上被调用,所以我只是将它直接连接到 UserService() 并且它起作用了,但是当我尝试编辑用户信息并让 TextFormField() 填充用户数据,通过 initState() 并让 fullNameControllerusermodel() 获取数据 返回的错误一直说在 null 上调用了 fullName!我该如何解决这个问题,谁能指出我在这里哪里出错了?

P.S 我正在关注这个 tutorial 来构建它。

我的 StreamBuilder() 连接到 UserProvider:

return StreamBuilder<usermodel>(
      stream: userProviderData.getCurrentUserData(),builder: (context,snapshot) {})

我的StreamBuilder()直接连接到UserService:

Directly connected to UserService
return StreamBuilder<usermodel>(
      stream: userService.getCurrentUser(),snapshot) {})

UserService() 类:

// Get User
  Stream<usermodel> getCurrentUser() {
    return _db.collection('users').doc(_auth.currentUser.uid).snapshots().map(
          (user) => usermodel.fromJson(user.data()),);
  }

  // Add or Update User info
  Future<void> saveUser(usermodel user) {
    final _options = Setoptions(merge: true);
    return _db.collection('users').doc(user.userId).set(user.toMap(),_options);
  }

UserProvider() 类:

final userProvider = ChangeNotifierProvider<UserProvider>((ref) {
  return;
});

class UserProvider with ChangeNotifier {
  final userService = UserService();

  String _userId;
  String _fullName;

  // Getters
  String get userId => _userId;
  String get fullName => _fullName;
  Stream<usermodel> get getCurrentUserData => userService.getCurrentUser();

  // Setters
  set changeFullName(String fullName) {
    _fullName = fullName;
    notifyListeners();
  }

  // Functions
  void loadUser(usermodel usermodel) {
    _userId = usermodel.userId;
    _fullName = usermodel.fullName;
  }

  void updateUser() {
    final _currentUser = usermodel(
      userId: _userId,fullName: _fullName,);
    userService.saveUser(_currentUser);
  }
}

EditProfileScreen()

class EditProfileScreen extends StatefulWidget {
  const EditProfileScreen({this.usermodel});
  final usermodel usermodel;
  @override
  _EditProfileScreenState createState() => _EditProfileScreenState();
}

class _EditProfileScreenState extends State<EditProfileScreen> {
  final _fullNameController = TextEditingController();
  final _validator = Validator();

  @override
  void dispose() {
    _fullNameController.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    final userStream = context.read(userProvider);
    if (widget.usermodel != null) {
      // Edit
      _fullNameController.text = widget.usermodel.fullName;
      userStream.loadUser(widget.usermodel);
    }
  }

  @override
  Widget build(BuildContext context) {
    final userData = context.read(userProvider);
    return Scaffold(
      body: Column(
        children: [
          TextFormFiled(
                hintText: ‘Full name’,keyboardType: TextInputType.name,controller: _fullNameController,validator: (value) => _validator.validateFullName(
                      value,),onChanged: (value) {
                  userData.changeFullName = value;
                  debugPrint(value);
                }
          ),ElevatedButton(
            onpressed: () {
              userData.updateUser();
              Navigator.of(context).pop();
            },child: const Text(‘Save’),],);
  }
}

解决方法

你忘记归还东西了吗?

final userProvider = ChangeNotifierProvider<UserProvider>((ref) {
  return; //return a UserProvider()
});