Flutter 相对仍是很新的一门技术,目前来看市场上好像阿里对 Flutter 的关注度最高,相关的技术讨论也是最多的。今天看了篇 Flutter 与 Native 混合栈开发的文章,以为 Flutter 好牛逼,固然这只是个 Flutter 新手的错觉~
文章写的很好,简单易懂,先放出处:在Flutter中嵌入Native组件的正确姿式是...,看了文章想亲自动手实践一下。php
Flutter 显示 Native 组件最关键的一个类是 AndroidView,它能够嵌入到 Widget 视图里,不过这种操做代价比较大, Flutter 官方文档描述提到尽量使用 Flutter 的实现方式来避免使用它。java
首先注意下 AndroidManifest.xml
文件 Application 的 name 参数为 io.flutter.app.FlutterApplication
,因此若是想在 Application 初始化百度地图 SDK 的话,应当继承它来重写 onCreate
方法android
新建一个名为 MainApplication.java
的文件git
public class MainApplication extends FlutterApplication { @Override public void onCreate() { super.onCreate(); // 初始化百度地图 SDK SDKInitializer.initialize(this); SDKInitializer.setCoordType(CoordType.BD09LL); } }
而后将 AndroidManifest.xml
的 application name 参数改成 .MainApplication
github
写一个 PlatformViewFactory
,PlatformViewFactory
的主要任务是,在 create() 方法中建立一个 View 并把它传给 Flutterapp
public class BMapViewFactory extends PlatformViewFactory { private MapView mapView; public BMapViewFactory(MessageCodec<Object> createArgsCodec, MapView mapView) { super(createArgsCodec); this.mapView = mapView; } @Override public PlatformView create(final Context context, int i, Object o) { return new PlatformView() { @Override public View getView() { return mapView; } @Override public void dispose() { } }; } }
添加 ViewRegistrant
类将该插件注册到 APP,ViewType
为 MapView
。参数中新增实例化的百度地图 MapView。less
public final class ViewRegistrant { public static void registerWith(PluginRegistry registry, MapView mapView) { final String key = ViewRegistrant.class.getCanonicalName(); if (registry.hasPlugin(key)) return; PluginRegistry.Registrar registrar = registry.registrarFor(key); registrar.platformViewRegistry().registerViewFactory("MapView", new BMapViewFactory(new StandardMessageCodec(), mapView)); } }
在 MainActivity
中实例化地图而且注册以上添加的 ViewRegistrant
类。ide
public class MainActivity extends FlutterActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MapView mapView = new MapView(this); ViewRegistrant.registerWith(this, mapView); } }
简单实现一个只有地图的界面,实例化 AndroidView
,viewType
设置为刚刚建立的 MapView
,将百度地图显示。ui
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new Scaffold( appBar: AppBar(title: Text("Map"),), body: new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded(child: new AndroidView(viewType: 'MapView')) ], ), ), ); } }
如此,地图正常显示了。this
应一些朋友的要求,放一下项目源码,欢迎 star FlutterWithMap
个人博客:时空路由器
文章原地:Flutter 显示百度地图 Native 组件