前言:
我們?cè)谑褂胒lutter開(kāi)發(fā)的時(shí)候有時(shí)候會(huì)遇到調(diào)用flutter sdk里面的api沒(méi)有辦法實(shí)現(xiàn)的時(shí)候 我們就要用Android 或者iOS原生的代碼去實(shí)現(xiàn)(例如獲取手機(jī)的IMEI號(hào) 等等) 我們獲取到參數(shù)的值我們需要flutter跟原生進(jìn)行交互把數(shù)據(jù)回傳到flutter 代碼里面來(lái) 因?yàn)闆](méi)有iOS設(shè)備 今天我們就主要講flutter跟安卓原生的交互 廢話不多說(shuō) 我們正式開(kāi)始
效果圖
準(zhǔn)備工作
我們需要 自己安裝好flutter的環(huán)境 這個(gè)我之前的博客有講到
請(qǐng)看我之前的博客 地址 http://www.reibang.com/p/db3584019225
具體實(shí)現(xiàn)
我們?cè)趂lutter代碼里面 現(xiàn)在寫(xiě)一個(gè) Column里面包含一個(gè) FlatButton 和一個(gè)Text
body:Column(
children: <Widget>[
FlatButton(
child: Text("調(diào)用native 接口"),
onPressed: () async{
String result=await platform.invokeMethod("call_native_method");
setState(() {
_result=result;
print("_result ---->"+_result);
});
},
),
Text("result is: "+_result)
],
),
效果圖
flutter 端完整代碼 flutter main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
static const String CHINAL_NAME="samples.flutter.study/call_native";
static const platform=const MethodChannel(CHINAL_NAME);
String _result="";
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text("flutter和native通信"),
),
body:Column(
children: <Widget>[
FlatButton(
child: Text("調(diào)用native 接口"),
onPressed: () async{
String result=await platform.invokeMethod("call_native_method");
setState(() {
_result=result;
print("_result ---->"+_result);
});
},
),
Text("result is: "+_result),
],
),
);
}
}
然后我們定義跟安卓原生交互的變量 CHINAL_NAME
static const String CHINAL_NAME="samples.flutter.study/call_native";
static const platform=const MethodChannel(CHINAL_NAME);
String _result="";
這里的CHINAL_NAME要跟在安卓原生里面的對(duì)應(yīng)上
然后我們?cè)贔latButton 點(diǎn)擊事件里面進(jìn)行接收安卓原生的回傳的消息
FlatButton(
child: Text("調(diào)用native 接口"),
onPressed: () async{
String result=await platform.invokeMethod("call_native_method");
setState(() {
_result=result;
//這里將我們拿到回傳的值 賦值給我們自己定義的 _result 然后打
//印到控制臺(tái)觀察
print("_result ---->"+_result);
});
},
),
2安卓原生部分的代碼 (java版)
package com.example.flutter_callnative;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class Main2Activity extends FlutterActivity {
String C_NAME="samples.flutter.study/call_native";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MethodChannel(getFlutterView(),C_NAME).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if(methodCall.method.equals("call_native_method")){
result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)");
}else{
result.success("I don't know what you say");
}
}
}
);
GeneratedPluginRegistrant.registerWith(this);
}
}
2安卓原生部分的代碼 (kotlin版)
package com.example.flutter_callnative
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity : FlutterActivity() {
var C_NAME = "samples.flutter.study/call_native"
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
MethodChannel(flutterView, C_NAME).setMethodCallHandler { methodCall, result ->
if (methodCall.method == "call_native_method") {
result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)")
} else {
result.success("I don't know what you say")
}
}
GeneratedPluginRegistrant.registerWith(this)
}
}
我們需要頂一個(gè) String C_NAME="samples.flutter.study/call_native";
跟flutter里面對(duì)應(yīng)的通行的 字符串名字 然后在MethodChannel 構(gòu)造方法里面?zhèn)魅? 然后在setMethodCallHandler 回調(diào)方法里面進(jìn)行處理回傳的消息
if(methodCall.method.equals("call_native_method")){
result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)");
}else{
result.success("I don't know what you say");
}
我們需要判斷methodCall.method.equals("call_native_method") methodCall.method是否跟flutter 里面接收的方法名字是否對(duì)應(yīng)一樣 如果已經(jīng)通過(guò) result.success("我是安卓原生回傳回來(lái)的數(shù)據(jù)"); 將我們需要回傳的數(shù)據(jù)傳回去 result.success 里面?zhèn)魅氲念愋褪莖bject 類型所有類型都支持
android 部分的代碼已經(jīng)實(shí)現(xiàn)了
然后我們回到flutter代碼里面接收情況
在flutter里么我們用過(guò)
String result=await platform.invokeMethod("call_native_method");
來(lái)接收
然后將result 顯示在我們的Text里面
當(dāng)我們點(diǎn)擊 FlatButton 就顯示回傳的數(shù)據(jù)如圖
下面我們通過(guò)日志也可以看到
到此我們就基本實(shí)現(xiàn)了flutter和安卓原生客戶端的簡(jiǎn)單交互
項(xiàng)目地址 :https://gitee.com/qiuyu123/flutter-call-native.git
最后總結(jié):
這個(gè)flutter 和安卓原生的交互代碼相對(duì)較少 有些寫(xiě)法也是基本是固定寫(xiě)法侧纯,交互的方法名和CHINAL_NAME 我們可以自己發(fā)揮定義但是要注意原生客戶端和flutter需要對(duì)應(yīng)上 然后就是獲取回傳回來(lái)的數(shù)據(jù)需要用到異步很魂。
實(shí)現(xiàn)起來(lái)算是比較簡(jiǎn)單.最后希望我的文章能幫助到各位解決問(wèn)題