說道抽象類abstract,就不得不說壹下external關鍵字,external關鍵字估計用到人很少,在看源碼的時侯經常可以看到,如下:
external只聲明方法,聲明的方法需要由外部去實現 ,通常是由底層sdk根據不同平臺(vm、web等)實現;若外部沒實現,則會返回null;
external聲明的方法,通過@patch註解實現 , 結構如上 ;
比如Object裏各種external聲明方法的 實現如下 :
移動端external聲明方法實現在vm目錄下:
web端external聲明方法實現在js_runtime目錄下:
external方法的實現文件壹般命名為xxx_patch.dart,如在vm/lib目錄下,可以看到各種xxx_patch.dart文件:
可以在終端通過grep搜索命令找到對應類裏external方法實現的xxx_patch.dart文件:
以查找Object類裏external方法的實現為例:
1、Object類定義如下:
可以看到Object類裏有很多方法都是用external聲明
2、在flutter sdk目錄/bin/cache/dart-sdk/lib/_internal目錄下,執行查找class Object命令:
由此可知:web端Object實現文件是./js_runtime/lib/core_patch.dart
移動端Object實現文件是./vm/lib/object_patch.dart
打開web端Object實現文件./js_runtime/lib/core_patch.dart,如下:
打開移動端Object實現文件./vm/lib/object_patch.dart,如下:
可以看到Object裏各種external聲明方法對應的@patch註解實現方法