【问题标题】:I keep getting getters called on null when I try to update the user profile当我尝试更新用户配置文件时,我不断收到调用 null 的 getter
【发布时间】:2021-07-13 18:11:05
【问题描述】:

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

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(),
      builder: (context, 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’),
          ),
        ],
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart google-cloud-firestore crud riverpod


    【解决方案1】:

    你忘记退货了吗?

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

    【讨论】:

    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多