flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
在上一篇文章從頭開發(fā)一個Flutter插件(一)開發(fā)流程里具體介紹了flutter插件的具體開發(fā)流程,從創(chuàng)建項目到發(fā)布。接下來將會為Flutter天氣項目開發(fā)一個基于高德定位sdk的flutter定位插件。
申請key
首先先進入到高德地圖定位sdk文檔內(nèi)下載定位sdk,并按要求申請app key,這里不多做介紹,文檔已經(jīng)很詳細了
配置環(huán)境
sdk文檔里同樣有關(guān)于配置工程的demo,但是因為flutter 插件項目不是一個android工程,所以會有所區(qū)別。大致分以下幾步:
1.集成遠程依賴
compile 'com.amap.api:location:latest.integration'
復(fù)制代碼
2.配置app key
在AndroidManifest.xml的application標簽中配置Key:
android:value="您的Key">
復(fù)制代碼
3.聲明service
在application標簽中聲明service組件:
復(fù)制代碼
4.聲明權(quán)限
flutter插件的目的就是隔離對sdk native code的實現(xiàn),讓使用者直接使用dart代碼就可以獲得到sdk提供的定位信息,插件和使用者交互的代碼是在libs下的dart文件中提供的接口。
插件的android文件夾下面是一個完整的android工程結(jié)構(gòu),我們在這個工程下完成上述的四步。唯一一點不同的是,配置app key利用gradle里的manifestPlaceholders屬性為用戶預(yù)留,讓用戶自己來填寫。
于是配置app key改寫成:
android:name="com.amap.api.v2.apikey"
ndroid:value="${LOCATION_APP_KEY}"/>
復(fù)制代碼
這個LOCATION_APP_KEY,使用者使用插件的時候在自己flutter項目的android工程下的app/build.gradle文件里填寫自己申請的高德key即可。
android {
compileSdkVersion 27
lintOptions {
...
}
defaultConfig {
...
manifestPlaceholders = [
LOCATION_APP_KEY : "b947abf0a6820efedc65d06428f14281", /// 高德地圖key
]
}
}
復(fù)制代碼
到目前為止,一個基于高德sdk的定位插件工程就算配置好了,下面就是實現(xiàn)部分。
實現(xiàn)
flutter 插件最終暴露給插件使用者的是dart代碼的接口,使用者不再需要關(guān)心Android和Ios平臺上的代碼,在定位插件項目中,唯一需要配置的就是上文所說的高德開放平臺的app key.
因為現(xiàn)在是將特定平臺的sdk開發(fā)成插件供flutter app使用,其實就可以理解在Android或者ios平臺正常開發(fā)項目,將flutter app需要的數(shù)據(jù)傳遞過去,flutter插件只是在特定平臺的實現(xiàn)上做了一次封裝與隔離,封裝了dart接口,隔離了兩個不同平臺實現(xiàn)的差異。
理解這個概念,寫出一個flutter插件就變得很容易了,dart和java之間的相互通信在前面寫的一篇文章Flutter探索與實踐中Flutter和原生互相通信一節(jié)講述過,這里就直接上手展示源碼。
Java部分
java部分的代碼寫在了AmapLocationPlugin.java類下面,它分別實現(xiàn)了MethodChannel.MethodCallHandler, EventChannel.StreamHandler。并且在registerWith方法調(diào)用的實例化MethodChannel和EventChannel。
final MethodChannel methodChannel = new MethodChannel(registrar.messenger(), "plugin.kinsomy.com/methodchannel");
final EventChannel eventChannel = new EventChannel(registrar.messenger(), "plugin.kinsomy.com/eventchannel");
復(fù)制代碼重寫MethodChannel.MethodCallHandler的onMethodCall方法接受dart代碼的方法調(diào)用
@Override
public void onMethodCall(MethodCall call, Result result){
if (call.method.equals("startLocation")) {
//啟動定位
mLocationClient.startLocation();
} else if (call.method.equals("stopLocation")) {
//停止定位
mLocationClient.stopLocation();
} else if (call.method.equals("getLocation")) {
result.success(mLocation);
} else {
result.notImplemented();
}
}
復(fù)制代碼重寫EventChannel.StreamHandler的onListen,該方法攜帶了一個EventChannel.EventSink實例,通過該實例對象可以調(diào)用mEventSink.success()向dart傳遞數(shù)據(jù)流,也就是插件里的定位信息
@Override
public void onListen(Object o, EventChannel.EventSink eventSink){
this.mEventSink = eventSink;
}
復(fù)制代碼通過高德sdk的AMapLocationClient獲取到定位信息,并將其封裝成json字符串供dart調(diào)用。
dart部分
dart部分的代碼在項目根目錄lib文件夾下的amap_location_plugin.dart文件。
在構(gòu)造函數(shù)里實例化和java代碼中同樣channel name的MethodChannel與EventChannel
factory AmapLocation() {
if (_instance == null) {
final MethodChannel methodChannel =
const MethodChannel('plugin.kinsomy.com/methodchannel');
final EventChannel eventChannel =
const EventChannel('plugin.kinsomy.com/eventchannel');
_instance = AmapLocation.private(methodChannel, eventChannel);
}
return _instance;
}
復(fù)制代碼提供接口方法開始定位startLocation和對應(yīng)的停止定位
Future get startLocation =>
_methodChannel.invokeMethod("startLocation");
復(fù)制代碼實例化Stream接受event返回的定位數(shù)據(jù)
Stream _onLocationFetched;
_onLocationFetched =
_eventChannel.receiveBroadcastStream().map((dynamic event) => event);
復(fù)制代碼
這樣一個基于高德定位sdk的flutter定位插件就算完成了,在example里寫一個demo實際測試一下。
目前這個插件還是個簡易版本,未來希望能加上地圖,導(dǎo)航,線路規(guī)劃等一系列的功能
項目地址 ,歡迎貢獻代碼和issue,喜歡可以給個star
參考文檔
總結(jié)
以上是生活随笔為你收集整理的flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 AirPods 新专利:耳机充电盒
- 下一篇: catia中sew的用法_CATIA超级