Flutter GestureDetector同时用缩放平移报错,求经纬度调整方案
解决GestureDetector同时支持缩放和平移的问题
Flutter的GestureDetector报错核心原因是缩放手势本身已包含平移功能,同时注册平移、缩放两种手势识别器属于冗余配置,只需保留onScaleUpdate回调,把平移逻辑整合进去即可,无需额外使用onPanUpdate。
修改后的代码直接将平移判断逻辑移入onScaleUpdate,利用回调参数details.delta获取平移偏移量,同时保留你原有的缩放逻辑:
Positioned( top: 250, right: 10, child: GestureDetector( onScaleUpdate: (details) { setState(() { // 处理缩放逻辑 double scaleFactor = details.scale; if (scaleFactor > 1) { topL[chosenPlate]!.latitude += tolerance; botL[chosenPlate]!.latitude -= tolerance; botR[chosenPlate]!.latitude -= tolerance; topL[chosenPlate]!.longitude -= tolerance; botL[chosenPlate]!.longitude -= tolerance; botR[chosenPlate]!.longitude += tolerance; } else if (scaleFactor < 1) { topL[chosenPlate]!.latitude -= tolerance; topL[chosenPlate]!.longitude -= tolerance; botL[chosenPlate]!.latitude += tolerance; botL[chosenPlate]!.longitude -= tolerance; botR[chosenPlate]!.latitude += tolerance; botR[chosenPlate]!.longitude += tolerance; } // 处理平移逻辑 if (details.delta.dx < 0) { topL[chosenPlate]!.longitude -= tolerance; botL[chosenPlate]!.longitude -= tolerance; botR[chosenPlate]!.longitude -= tolerance; } else if (details.delta.dx > 0) { topL[chosenPlate]!.longitude += tolerance; botL[chosenPlate]!.longitude += tolerance; botR[chosenPlate]!.longitude += tolerance; } if (details.delta.dy < 0) { topL[chosenPlate]!.latitude += tolerance; botL[chosenPlate]!.latitude += tolerance; botR[chosenPlate]!.latitude += tolerance; } else if (details.delta.dy > 0) { topL[chosenPlate]!.latitude -= tolerance; botL[chosenPlate]!.latitude -= tolerance; botR[chosenPlate]!.latitude -= tolerance; } }); }, child: Container( height: 20.h, width: 30.w, color: Color.fromARGB(255, 233, 176, 176), ), ), )
额外说明:
- 将分散的
setState合并到同一个回调中,避免多次触发UI更新 - 缩放参数
scaleFactor为相对比例,你的固定tolerance增减逻辑可直接沿用 - 平移参数
delta与原onPanUpdate的偏移量逻辑完全一致,无需额外转换
内容的提问来源于stack exchange,提问作者Pannam
相关产品推荐
相关产品推荐

