Flutter中抽象类NetworkImage为何可实例化?
为什么Flutter的抽象类NetworkImage可以被实例化?
先看你的代码场景:
CircleAvatar( backgroundImage: NetworkImage(''), ),
你注意到NetworkImage是抽象类,但却能直接调用构造函数实例化,而它的父类ImageProvider作为抽象类直接实例化会报错,核心原因在于Dart的工厂构造函数特性。
看你贴的NetworkImage源码:
abstract class NetworkImage extends ImageProvider<NetworkImage> { const factory NetworkImage(String url, { double scale, Map<String, String>? headers }) = network_image.NetworkImage; String get url; double get scale; Map<String, String>? get headers; @override ImageStreamCompleter load(NetworkImage key, DecoderCallback decode); @override ImageStreamCompleter loadBuffer(NetworkImage key, DecoderBufferCallback decode); }
这里的factory NetworkImage(...) = network_image.NetworkImage;是重定向工厂构造函数——它并没有尝试实例化抽象的NetworkImage本身,而是把构造调用直接转发给了Flutter框架内部的一个具体实现类network_image.NetworkImage。
这个内部的network_image.NetworkImage是NetworkImage抽象类的非抽象子类,它已经实现了所有抽象方法(比如load、loadBuffer)。所以当你调用NetworkImage('your_url')时,实际得到的是这个具体子类的实例,它完全符合ImageProvider类型要求,因此能正常赋值给CircleAvatar的backgroundImage属性。
而ImageProvider本身没有提供这样的工厂构造函数,直接调用ImageProvider()时,Dart会尝试实例化抽象类,自然会报错。
内容的提问来源于stack exchange,提问作者Pearl Lee
相关产品推荐
相关产品推荐

