Flutter填坑系列之Amap(一)

Flutter填坑系列之Amap(1)

简介

随着Flutter的推出,使得移动端Write once, Run anywhere 变得可能,但是由于前期Flutter库数量以及质量都不够丰富,所以必然会导致Native层代码的编写。

此次就给介绍下Flutter中地图模块的使用情况,以及所遇到的各种坑......

 

一、配置安装

参考https://github.com/yohom/amap_base_flutter

需要注意的是:

1、默认Plugin中支持的是AndroidX,这就要求了如果之前还没有兼容AndroidX的项目,首先需要处理AndroidX兼容问题。

2、Android运行注意事项:指定项目的编译选项Additional arguments增加--target-platform android-arm (如果机器是64位,记得添加64,如果不添加,部分机型奔溃)从

Flutter填坑系列之Amap(1)

简介

随着Flutter的推出,使得移动端Write once, Run anywhere 变得可能,但是由于前期Flutter库数量以及质量都不够丰富,所以必然会导致Native层代码的编写。

此次就给介绍下Flutter中地图模块的使用情况,以及所遇到的各种坑......

 

一、配置安装

参考https://github.com/yohom/amap_base_flutter

需要注意的是:

1、默认Plugin中支持的是AndroidX,这就要求了如果之前还没有兼容AndroidX的项目,首先需要处理AndroidX兼容问题。

2、Android运行注意事项:指定项目的编译选项Additional arguments增加--target-platform android-arm (如果机器是64位,记得添加64,如果不添加,部分机型奔溃)

IOS目前还只是preview状态, 默认是不支持的, 需要手动打开开关, 在info.plist文件中新增一行io.flutter.embedded_views_preview为true

 

3、Android打包注意事项:

增加了Android so文件的Flutter项目需要 在指令flutter build apk 后增加 --target-platform android-arm,同理,64位机记得改为arm64。

 

二、Amap库中的一些坑

1、生命周期管理

在Flutter中,如果一个组件生命周期接近尾声,通常会通过dispose在处理身后事,然而在之前的开发中,我发现Amap中的dispose并不怎么好使,页面销毁后再次调用Amap的一些方法时,在IOS端直接原地爆炸,并且没有任何异常报错...... 跟踪代码才发现dispose如下:

void dispose() {}

 

这就明白奔溃的原因了...... AmapController因为引用的存在并没有及时被销毁,但是AmapView是NativeView,以及被销毁了(后续章节会讲述NativeView的一些知识),上层Flutter通过MethodChannel通信机制同步信息到AmapView的时候,因为AmapView已经被销毁,所以直接Native层直接崩溃。

解决方案:

最好的解决方案当然是自己注意控件的生命周期,不要乱用,但是谁要保不准会出现什么奇葩现象,所以,我就在Flutter层增加了关于AmapView等生命周期判断,这样不管怎么乱来,起码不会崩溃了...... 代码如下:

  AMapController.withId(int id)
      : _mapChannel = MethodChannel('me.yohom/map$id'),
        _markerClickedEventChannel = EventChannel('me.yohom/marker_clicked$id'),
        _isActive = true;
        

  void dispose() {_isActive = false;}

  void deActive(){
    _isActive = false;
  }

  void active(){
    _isActive = true;
  }

  bool isActive(){
    return _isActive;
  }

2、点击Marker崩溃问题(IOS)

这个是我遇到过最心塞的问题了:崩就崩吧,和上个问题一样,没有任何报错......直接虚拟断开连接。

解决方案:如果需要地图增加Marker点,那么请先增加一个Marker点的点击回调监听......具体原因会在后续章节,做Amap源码分析的时候进行讲解。

3、addMarks镜头移动问题(IOS)

先看下Flutter的调用:

  Future addMarkers(
    List<MarkerOptions> optionsList, {
    bool moveToCenter = true,
    bool clear = true,
  }) {
    final _optionsListJson =
        jsonEncode(optionsList.map((it) => it.toJson()).toList());
    L.p('方法addMarkers dart端参数: _optionsListJson -> $_optionsListJson');
    return _mapChannel.invokeMethod(
      'marker#addMarkers',
      {
        'moveToCenter': moveToCenter,
        'markerOptionsList': _optionsListJson,
        'clear': clear,
      },
    );
  }

理论上来说,addMarks提供了是否进行移动的设置,然鹅,在IOS平台并没有什么卵用......这就很尴尬了,我的项目里涉及到了大量marker点的使用(参考自如那种),如果每次marker点的批量增加都会涉及到镜头的移动,那不尴尬死??? 这里有个粗暴的解决方案,就是直接进入IOS代码进行修改....... 

进到IOS的工程里,找到对应文件

要处理的就是这一行:

当然暴力删除法并不优雅,后续章节会介绍MethodChannel的使用已经如何处理这个问题......

4、Android打包真机运行崩溃

     就像我之前所的那样,不要仅仅只用flutter build apk打包,记得告诉编译器你要打包的native类型:lutter build apk  --target-platform android-arm(记得如果是64位,增加下64)

5、And More

     最大的问题其实是,Flutter_Amap并不能给基于地图开发功能足够的地图功能支持,例如:地图移动事件回调,地图点击事件反馈,点聚合...... 这些问题,下篇见

     总的来说,Flutter现在在移动端会有三方库支持不足的问题(要么根本没有、有么就是残缺版)......毕竟flutter还年轻,随着时间的推移,这些问题也将不再是问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
flutter_map是一个用于在Flutter应用程序中集成地图的插件[^2]。下面是一个使用flutter_map插件的示例: 首先,您需要在`pubspec.yaml`文件中添加flutter_map的依赖项: ```yaml dependencies: flutter_map: ^0.3.0 ``` 然后,运行`flutter packages get`命令来获取依赖项。 接下来,您可以在Flutter应用程序中使用flutter_map插件。以下是一个简单的示例,展示如何在地图上显示一个标记点: ```dart import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong/latlong.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Map Demo', home: Scaffold( appBar: AppBar( title: Text('Flutter Map Demo'), ), body: FlutterMap( options: MapOptions( center: LatLng(51.5, -0.09), zoom: 13.0, ), layers: [ TileLayerOptions( urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", subdomains: ['a', 'b', 'c'], ), MarkerLayerOptions( markers: [ Marker( width: 80.0, height: 80.0, point: LatLng(51.5, -0.09), builder: (ctx) => Container( child: FlutterLogo(), ), ), ], ), ], ), ), ); } } ``` 在上面的示例中,我们创建了一个Flutter应用程序,并在地图上显示了一个标记点。我们使用了`FlutterMap`小部件来显示地图,并使用`MapOptions`来设置地图的中心点和缩放级别。我们还使用了`TileLayerOptions`来指定地图瓦片的URL模板,以及`MarkerLayerOptions`来添加标记点。 请注意,为了使用flutter_map插件,您还需要在`pubspec.yaml`文件中添加`latlong`库的依赖项: ```yaml dependencies: latlong: ^0.6.1 ``` 这是一个简单的示例,您可以根据自己的需求进行更多的定制和功能扩展。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值