Dart中从静态方法访问同类私有实例方法报错的原因及解决方法
解决Dart静态方法访问私有实例方法的报错问题
你遇到的Instance members can't be accessed from a static method错误,本质是静态成员和实例成员的核心区别导致的:
info()是静态方法,它属于MyClass这个类本身,不需要创建类的实例就能调用,整个程序里它只有一份存在;- 而
_initFunc()是实例私有方法,它绑定到MyClass的具体对象上,必须先创建实例,才能通过实例去调用它。静态方法没有关联任何实例,自然找不到对应的_initFunc()来执行,所以编译器直接报错了。
下面给你两种符合要求的解决方案(保证info()是静态、_initFunc()是私有):
方案1:将_initFunc()改为静态私有方法
如果_initFunc()不需要访问类的实例变量或依赖实例状态,直接把它也改成静态方法就行,这样静态的info()就能直接调用它:
class MyClass{ static void _initFunc() { /// 这里不需要访问任何实例成员 } static void info(){ if (condition){ _initFunc(); } } }
方案2:在静态方法内创建类实例,再调用私有方法
如果_initFunc()必须是实例方法(比如需要操作实例变量),那可以在info()里先创建MyClass的实例,然后通过这个实例调用私有方法——Dart的私有方法是库级私有,同一个类内部的代码完全有权限访问:
class MyClass{ String? _instanceState; // 假设_initFunc需要操作实例状态 void _initFunc() { _instanceState = "initialized"; /// ... 其他实例相关操作 } static void info(){ if (condition){ final myInstance = MyClass(); myInstance._initFunc(); // 同一个类内部可访问私有实例方法 } } }
内容的提问来源于stack exchange,提问作者Adil Khalil
相关产品推荐
相关产品推荐

