Flutter中_WordMarker私有类型用于公共API的警告消除求助
解决“Avoid using private types in public APIs”警告的有效方法
你在WordMarker类的updateRenderObject方法中使用了私有类_WordMarker作为参数类型,触发了lint警告。相关代码如下:
class WordMarker extends SingleChildRenderObjectWidget { final int index; const WordMarker({required Widget child, required this.index, Key? key}) : super(child: child, key: key); @override RenderObject createRenderObject(BuildContext context) { return _WordMarker()..index = index; } //Warning message on _WordMarker @override void updateRenderObject(BuildContext context, _WordMarker renderObject) { renderObject.index = index; } } class _WordMarker extends RenderProxyBox { late int index; }
以下是几种有效解决该警告的方案:
方案一:用父类类型替代私有类作为参数类型
由于_WordMarker继承自RenderProxyBox,可以将updateRenderObject的参数类型改为父类,再通过类型转换访问私有类的属性:@override void updateRenderObject(BuildContext context, RenderProxyBox renderObject) { (renderObject as _WordMarker).index = index; }这种方式既保留了
_WordMarker的私有性,又避免了在公共API中暴露私有类型。方案二:将私有类改为公共类
如果不需要隐藏_WordMarker的实现细节,直接去掉类名前的下划线,将其改为公共类:class WordMarkerRenderObject extends RenderProxyBox { late int index; }同步更新对应的方法:
@override RenderObject createRenderObject(BuildContext context) { return WordMarkerRenderObject()..index = index; } @override void updateRenderObject(BuildContext context, WordMarkerRenderObject renderObject) { renderObject.index = index; }方案三:定义公共接口/抽象类
若想隐藏_WordMarker的具体实现但需要访问特定属性,可以定义一个公共抽象类,让私有类实现该接口:abstract class WordMarkerRenderInterface { set index(int value); } class _WordMarker extends RenderProxyBox implements WordMarkerRenderInterface { late int index; @override set index(int value) => this.index = value; }随后在
updateRenderObject中使用公共接口作为参数类型:@override void updateRenderObject(BuildContext context, WordMarkerRenderInterface renderObject) { renderObject.index = index; }
内容的提问来源于stack exchange,提问作者Mr. Tacio
相关产品推荐
相关产品推荐

