flutter 代码生成

获取 AST builder 中对象解析是基于 analyzer 模块实现的,对于 Element 对象未封装的元数据, 可以直接通过访问其 AST 获取。 在 LibraryElement 对象中提供了 session 属性用于访问解析库的会话 AnalysisSession 对象, 这里可以查询已解析的元素语法树。 // 初始化参数从 AST 中取 final libraryResult = library.session.getParsedLibraryByElement(library) as ParsedLibraryResult; final declarationResult = libraryResult.getElementDeclaration(field); if (declarationResult != null) { final variableDeclaration = declarationResult.node as VariableDeclaration; if (variableDeclaration.initializer != null) { builder.assignment = code.Code(variableDeclaration.initializer!.toSource()); } } 在 VSCode 中调试生成器 build 库通过生成 .dart_tool/build/entrypoint/build.dart 执行代码生成,调试这个 dart 文件就可以加载自己写的生成器。 在 .vscode 的 launch.json 文件中增加 { "name": "model_gen_example model_gen", "cwd": "packages/model_gen_example", "request": "launch", "program": "....

July 4, 2022 · 1 min · lyincc

Flutter 手势识别源码探究

引擎层 Flutter Engine 暴露了 FlutterEngineSendPointerEvent 接口供平台层调用。通过向该接口传递 FlutterPointerEvent 对象告知引擎当前指针状态。 FLUTTER_EXPORT FlutterEngineResult FlutterEngineSendPointerEvent( FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterPointerEvent* events, size_t events_count); SDK 层 事件源 Flutter SDK 则通过 GestureBinding 类管理手势事件。GestureBinding 在初始化时在 window 对象中设置了 _handlePointerDataPacket 回调接收引擎层传回的指针状态。 @override void initInstances() { super.initInstances(); _instance = this; window.onPointerDataPacket = _handlePointerDataPacket; } 经过指针事件队列 _pendingPointerEvents 缓冲后,handlePointerEvent 将对事件进行重采样处理。之后在 _handlePointerEventImmediately 过程中进行实际事件分发。 命中测试 在 _handlePointerEventImmediately 过程中事件分发前需要先对 PointerDownEvent 事件构造 HitTestResult。 // @@ void _handlePointerEventImmediately(PointerEvent event) { if (event is PointerDownEvent || event is PointerSignalEvent || event is PointerHoverEvent) { assert(!...

January 28, 2021 · 3 min · lyincc