Flutter调用Storage.uploadFile报静态访问实例成员错误如何解决
错误原因
报错Instance member 'uploadFile' can't be accessed using static access.dartstatic_access_to_instance_member的核心原因是:
- 你在
Storage类中定义的uploadFile是实例成员方法,需要先创建Storage类的实例才能调用 - 你在按钮点击逻辑中直接通过类名
Storage.uploadFile()的方式调用,属于静态访问语法,不符合实例方法的调用规则 - 你其实已经在代码开头创建了
Storage的实例:final Storage storage = Storage();,但调用时没有使用这个实例对象。

修复方案
你可以任选以下一种方案修复,不要混用:
方案1:使用已创建的实例调用(改动最小)
直接修改按钮点击逻辑中的调用代码,把类名调用替换成实例调用即可:
// 原代码:Storage.uploadFile(path, fileName); // 替换为: await storage.uploadFile(path, fileName);
因为uploadFile是异步方法,加上await可以保证代码等待文件上传完成后再执行后续逻辑,避免时序问题。
方案2:将方法改为静态方法(适合不需要实例化场景)
如果你希望直接通过类名调用方法,不需要实例化Storage对象,可以修改storage_services.dart中的类定义,给成员加static关键字:
import 'dart:io'; import 'package:firebase_storage/firebase_storage.dart'; class Storage { // 存储实例也改为静态 static final FirebaseStorage _storage = FirebaseStorage.instance; // 方法加static关键字修饰 static Future<void> uploadFile(String filePath, String fileName) async { File file = File(filePath); try { await _storage.ref("$fileName").putFile(file); } on Exception catch (e) { print(e); } } }
修改完成后,你原来写的Storage.uploadFile(path, fileName)就可以正常运行,开头创建的final Storage storage = Storage();属于冗余代码,可以直接删除。
注意:如果选择静态方案,后续给Storage类新增其他工具方法时,也需要加static关键字才能通过类名直接访问。
内容的提问来源于stack exchange,提问作者Emir Bolat
相关产品推荐
相关产品推荐

