Flutter报错:实例成员updateUser无法通过静态访问如何解决
报错原因
Instance member 'updateUser' can't be accessed using static access.报错的触发原因是:你直接通过类名AuthProvider调用了归属于类实例的成员方法updateUser。实例方法本身就依赖类实例化后持有的成员变量(比如你方法内用到的多个TextController),完全不需要强行把它改成静态方法,只要调整调用逻辑即可解决问题。
解决方案
1. 调整方法调用方式
不要直接用类名做静态调用,先获取AuthProvider的实例对象,再通过实例调用updateUser方法,根据你的项目架构可以选择对应实现:
- 如果你使用Provider做状态管理(从类名判断是绝大多数Flutter项目的常规用法),将按钮的
onPressed逻辑替换为以下代码即可:
Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( child: Text("Bearbeiten"), onPressed: () async { if (_formKey.currentState.validate()) { // 获取当前上下文里的AuthProvider实例,listen: false表示此处不需要触发页面刷新 final authProvider = Provider.of<AuthProvider>(context, listen: false); await authProvider.updateUser( '1xorAjA7hRZfOdN3zpkAWI7spgp1', _birthDateInString, genderSelected, roleSelected ); _formKey.currentState.save(); Navigator.of(context).pop(); } }, ), )
- 如果你给
AuthProvider实现了单例模式,可以直接通过单例实例调用,格式为AuthProvider.instance.updateUser(...),但这种方式灵活性较差,不符合状态管理最佳实践,不推荐优先使用。 - 如果没有使用任何状态管理,只需要在当前页面的State类中提前初始化AuthProvider实例:
final AuthProvider authProvider = AuthProvider();,后续通过这个实例调用方法即可。
2. 修复方法内的隐藏逻辑bug
你当前写的updateUser方法存在数据写入错误:直接把TextController对象本身存入了Firestore,而不是用户实际输入的文本内容,需要给所有控制器对象加上.text属性获取输入值,修正后的方法代码如下:
Future<void> updateUser(String id, String birthday, String gender, String role) async { return await FirebaseFirestore.instance .collection('admins') .doc(id) .update({ 'username': usernameController.text, 'email': emailController.text, 'first name': firstNameController.text, 'last name': lastNameController.text, 'birthday': birthday, 'gender': gender, 'role': role, }) .then((value) => print("User Updated")) .catchError((error) => print("Failed to update user: $error")); }
内容的提问来源于stack exchange,提问作者albaum
相关产品推荐
相关产品推荐

