问题描述
您好,我是 Flutter 新手,我正在尝试为登录的用户做一个简单的用户配置文件屏幕,但我偶然发现了一些错误,第一个是当我尝试使用 StreamBuilder(),其中流没有从 UserProvider() 中的 getter 获取任何数据(这是我放置 BL 的地方)它一直说 getCurrentUserData() 在 null 上被调用,所以我只是将它直接连接到 UserService() 并且它起作用了,但是当我尝试编辑用户信息并让 TextFormField() 填充用户数据,通过 initState() 并让 fullNameController 从 usermodel() 获取数据 返回的错误一直说在 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()
});