隨著Flutter這一框架的快速發展,有越來越多的業務開始使用Flutter來重構或新建其產品。但在我們的實踐過程中發現,一方面Flutter開發效率高,性能優異,跨平臺表現好,另一方面Flutter也面臨著插件,基礎能力,底層框架缺失或者不完善等問題。
舉個栗子,我們在實現一個自動化錄製回放的過程中發現,需要去修改Flutter框架(Dart層面)的代碼纔能夠滿足要求,這就會有了對框架的侵入性。要解決這種侵入性的問題,更好地減少迭代過程中的維護成本,我們考慮的首要方案即面向切面編程。
面向切面編程即AOP(Aspect Oriented Programming),它可以在編譯時(或運行時),動態地將代碼切入到類的特定方法、特定位置上,從而在不修改源代碼的情況下給已有代碼動態統一地添加功能。
AOP能力究竟是運行時還是編譯時支持依賴於語言本身的特點。舉例來說在iOS中,Objective C本身提供了強大的運行時和動態性使得運行期AOP簡單易用。在Android下,Java語言的特點不僅可以實現類似AspectJ這樣的基於位元組碼修改的編譯期靜態代理,也可以實現Spring AOP這樣的基於運行時增強的運行期動態代理。 那麼Dart呢?一來Dart的反射支持很弱,只支持了檢查(Introspection),不支持修改(Modification);其次Flutter為了包大小,健壯性等的原因禁止了反射。