拓冰建站拓冰建站
首页 / 资讯中心 / 正文

深度解析 flet-map 的 SolidStrokePattern:用纯 Python 定义地图实线描边模式

深度解析 flet-map 的 SolidStrokePattern用纯 Python 定义地图实线描边模式【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址: https://gitcode.com/gh_mirrors/fl/fletSolidStrokePattern是 flet-mapFlet 官方的地图扩展包中负责实线描边的值类型它决定了地图上PolylineLayer折线与多边形边框是实线、虚线还是点线。本文以 solidstrokepattern.md 文档页为核心结合 types.py 源码与 Flutter 端解析实现完整讲解SolidStrokePattern的类设计、序列化机制、默认值行为以及与DashedStrokePattern、DottedStrokePattern、PatternFit的协作方式。读完后你将能够在地图图层中精确控制线型渲染并理解 flet-map 值类型从前端到渲染引擎的完整调用链。SolidStrokePattern 是什么一行代码定义一个实线描边从官方文档页的 API 定义看SolidStrokePattern是flet_map包导出的公开类型之一其语义非常直白一条连续不断solid/unbroken的描边模式。它没有自己的成员字段全部行为都由父类StrokePattern与类内部的类型标记机制承担。# sdk/python/packages/flet-map/src/flet_map/types.py ft.value class StrokePattern: Determines whether a stroke should be solid, dotted, or dashed, and the exact characteristics of each. This is an abstract class and shouldnt be used directly. See usable derivatives: - :class:~flet_map.SolidStrokePattern - :class:~flet_map.DashedStrokePattern - :class:~flet_map.DottedStrokePattern _type: Optional[str] field(initFalse, reprFalse, compareFalse, defaultNone) ft.value class SolidStrokePattern(StrokePattern): A solid/unbroken stroke pattern. def __post_init__(self): self._type solid从源码结构看整个实线模式的设计只有两个关键点StrokePattern是一个抽象基类官方 docstring 明确告诫不应直接使用它只定义了一个私有的_type字段initFalse、reprFalse、compareFalse即不参与初始化、打印与相等比较用于在传输时标识具体模式类型SolidStrokePattern通过重写__post_init__在构造完成后把_type置为字符串solid。这意味着实例化SolidStrokePattern()时不需要任何参数——它天然就是一个零配置的实线模式这也解释了为什么它可以作为PolylineMarker的默认描边。类层次与兄弟模式一组可互换的描边值类型SolidStrokePattern并不是孤立存在的。在 types.py 中它与另外两个具体子类共同组成StrokePattern家族类类型标记关键字段适用场景SolidStrokePatternsolid无连续实线默认DashedStrokePatterndashedsegments: list[ft.Number]、pattern_fit交替的虚线段与空隙DottedStrokePatterndottedspacing_factor: ft.Number 1.5、pattern_fit圆形点线三个类都以ft.value装饰说明它们是 Flet 的值类型value type会被整体序列化后发给客户端渲染而不是像控件那样拥有独立的生命周期。DashedStrokePattern需要显式参数的模式虚线模式与实线模式形成鲜明对比——它必须提供segments参数并附带严格的校验逻辑segments: list[ft.Number] A list of even length with a minimum of 2, in the form of [a₁, b₁, (a₂, b₂, ...)], where a should be the length of segments in units, and b the length of the space after each segment in units. Both values must be strictly positive. ... For example, [50, 10, 10, 10] will cause: * a segment of length 50px * followed by a space of 10px * followed by a segment of length 10px * followed by a space of 10px * followed by a segment of length of 50px * ... pattern_fit: PatternFit PatternFit.SCALE_UP def __setattr__(self, name, value): if name segments: if len(value) 2: raise ValueError(segments must contain at least two items) if len(value) % 2 ! 0: raise ValueError(segments length must be even) super().__setattr__(name, value)可以看到segments必须是偶数长度、至少 2 项的列表以段长、间距交替的形式描述模式一旦违反会在赋值阶段直接抛出ValueError。而SolidStrokePattern因为不需要任何参数天然规避了这类校验问题。DottedStrokePattern以线宽为基准的点距点线模式用spacing_factor控制点间距——间距是相对于stroke_width或Polygon.border_stroke_width的倍数1.0表示间距恰好等于线宽值越大点越稀疏并且它同样在__post_init__中校验spacing_factor 0时抛出ValueError。理解了兄弟模式就能明白SolidStrokePattern在整个描边体系中的定位它是唯一无参数、无需任何适配策略的模式因而成为折线/多边形边框的默认选择。底层机制_type标记与跨端序列化SolidStrokePattern的实现虽然极简但它依赖的_type序列化机制贯穿了整个 flet-map 的跨端通信。Python 端构造对象时写入_type solid这个字段会随值类型一起被编码为 JSON 发送给 Flutter 客户端Flutter 端在 utils/map.dart 的parseStrokePattern中根据_type分发到 flutter_map 库对应的构造器StrokePattern? parseStrokePattern(dynamic value, [StrokePattern? defaultValue]) { if (value null) return defaultValue; final type value[_type]; if (type dotted) { return StrokePattern.dotted( spacingFactor: parseDouble(value[spacing_factor], 1.5)!, patternFit: parsePatternFit(value[pattern_fit], PatternFit.scaleUp)!, ); } else if (type solid) { return const StrokePattern.solid(); } else if (type dashed) { var segments value[segments] as Listdynamic; return StrokePattern.dashed( patternFit: parsePatternFit(value[pattern_fit], PatternFit.scaleUp)!, segments: segments.map((e) parseDouble(e)).nonNulls.toList(), ); } return defaultValue; }这段 Dart 代码印证了几个实现事实Python 端_type的取值solid/dashed/dotted与 Dart 端的分支判断严格一一对应三个模式在 Flutter 端最终都映射为 flutter_map 库的StrokePattern系列构造器其中solid直接映射为无参的const StrokePattern.solid()与 Python 端零参数的设计完全对称pattern_fit在 Flutter 端同样有parsePatternFit解析默认回退到PatternFit.scaleUp与 Python 端PatternFit.SCALE_UP的默认值保持一致。这一机制也解释了为什么SolidStrokePattern的 Python 代码如此空它不需要携带任何额外配置一个_type标记就足以驱动整个渲染管线。如何与地图图层搭配使用默认值即为实线SolidStrokePattern的实战入口在PolylineMarker。查看 polyline_layer.pystroke_pattern: StrokePattern field(default_factorylambda: SolidStrokePattern()) Determines whether the line should be solid, dotted, or dashed, and the exact characteristics of each. 也就是说不设置stroke_pattern时地图折线默认就是实线——这是SolidStrokePattern最重要的实际行为。而PolygonMarker多边形则通过border_stroke_width、border_color等字段控制边框外观见 polygon_layer.py当需要在多边形或折线上使用点线/虚线时spacing_factor的基准宽度即来自stroke_width或border_stroke_width。下面是一个完整的可运行示例把默认实线与两种兄弟模式放进同一张地图对比展示框架参照 examples/extensions/map/multi_layers/main.pyimport flet as ft import flet_map as ftm def main(page: ft.Page): page.add( ftm.Map( layers[ ftm.TileLayer( url_templatehttps://tile.openstreetmap.org/{z}/{x}/{y}.png, ), ftm.PolylineLayer( polylines[ # 默认实线不传 stroke_pattern 即为 SolidStrokePattern ftm.PolylineMarker( colorft.Colors.BLUE, stroke_width5, coordinates[ ftm.MapLatitudeLongitude(10, 10), ftm.MapLatitudeLongitude(30, 15), ], ), # 显式指定实线与默认等价 ftm.PolylineMarker( colorft.Colors.GREEN, stroke_width5, stroke_patternftm.SolidStrokePattern(), coordinates[ ftm.MapLatitudeLongitude(10, 12), ftm.MapLatitudeLongitude(30, 17), ], ), # 虚线段长 50px、间距 10px 交替 ftm.PolylineMarker( colorft.Colors.RED, stroke_width5, stroke_patternftm.DashedStrokePattern( segments[50, 10, 10, 10], pattern_fitftm.PatternFit.SCALE_UP, ), coordinates[ ftm.MapLatitudeLongitude(10, 14), ftm.MapLatitudeLongitude(30, 19), ], ), # 点线默认间距为线宽的 1.5 倍 ftm.PolylineMarker( colorft.Colors.ORANGE, stroke_width5, stroke_patternftm.DottedStrokePattern( spacing_factor2.0, pattern_fitftm.PatternFit.SCALE_UP, ), coordinates[ ftm.MapLatitudeLongitude(10, 16), ftm.MapLatitudeLongitude(30, 21), ], ), ], ), ] ) ) ft.app(main)需要说明的是flet_map属于独立的扩展包运行前需先安装pip install flet-map并通过pyproject.toml将其声明为项目依赖地图控件只有MapLatitudeLongitude经纬度与PolylineLayer/PolygonLayer组合使用时描边模式才生效。PatternFit非实线模式的适配策略SolidStrokePattern无需关心模式与线长是否整除但它的两个兄弟模式都带有pattern_fit: PatternFit PatternFit.SCALE_UP字段。理解 PatternFit 枚举有助于你完整掌握描边体系其四个取值语义如下枚举值行为说明NONE不做任何适配严格按定义重复模式到终点即停止不推荐可能在线段末端留下缺口SCALE_DOWN缩放模式使其恰好整数次铺满折线向下取整模式相对更小SCALE_UP缩放模式使其恰好整数次铺满折线向上取整模式相对更大这是DashedStrokePattern与DottedStrokePattern的默认值APPEND_DOT按原样使用模式末段放不下则截断若末段未到达终点则在终点补一个点EXTEND_FINAL_DASH按原样使用模式末段放不下则截断若末段未到达终点则延伸末段直至终点仅对DashedStrokePattern有意义从源码 docstring 可以看到units单位默认指像素只有启用SCALE_UP时模式才可能被放大。这也是SolidStrokePattern不需要pattern_fit字段的原因——实线不存在模式长度与线长不整除的问题任何长度下它都是连续的。小结从文档到渲染的完整链条SolidStrokePattern是 flet-map 描边体系中最简单却也最常用的一环其技术要点可归纳为四条零参数值类型继承自抽象类StrokePattern仅通过__post_init__写入_type solidtypes.py默认描边PolylineMarker.stroke_pattern的默认工厂函数即SolidStrokePattern()polyline_layer.py所以地图折线默认就是实线跨端一致Flutter 端parseStrokePattern按_type分支solid映射为const StrokePattern.solid()utils/map.dart与兄弟模式互补DashedStrokePattern需要偶数长度的segmentsDottedStrokePattern需要大于 0 的spacing_factor二者都默认使用PatternFit.SCALE_UP适配线长。如需进一步探索推荐按以下路径继续阅读仓库源码描边类型的完整定义在 types.py折线图层与默认值在 polyline_layer.py跨端解析逻辑在 utils/map.dart而文档体系中与本文配套的类型页还包括 strokepattern.md、dashedstrokepattern.md、dottedstrokepattern.md 与 patternfit.md。【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址: https://gitcode.com/gh_mirrors/fl/flet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门