android invoke 参数,Flutter 与 Android 相互调用、传递参数

Flutter 调用原生

Android 定义插件

class MyFlutterPlugin implements MethodChannel.MethodCallHandler {

private final Activity activity;

public MyFlutterPlugin(Activity activity) {

this.activity = activity;

}

@Override

public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {

if (methodCall.method.equals("getUser")) {

Integer userId = methodCall.argument("userId");

String mockUser = String.format("{\"name\":\"Wiki\",\"id\":%s}", userId);

result.success(mockUser);

}

}

public static void registerWith(PluginRegistry registry) {

String CHANNEL = "com.example.flutter_app/plugin";

PluginRegistry.Registrar registrar = registry.registrarFor(CHANNEL);

MethodChannel methodChannel = new MethodChannel(registrar.messenger(), CHANNEL);

MyFlutterPlugin myFlutterPlugin = new MyFlutterPlugin(registrar.activity());

methodChannel.setMethodCallHandler(myFlutterPlugin);

}

}

Android 插件注册

public class MainActivity extends FlutterActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

GeneratedPluginRegistrant.registerWith(this);

MyFlutterPlugin.registerWith(this);

}

}

Flutter 调用原生插件

static const myPlugin = const MethodChannel('com.example.flutter_app/plugin');

void getUser() async {

Map map = {"userId": 101};

String result = await myPlugin.invokeMethod("getUser", map);

print(result);

}

原生调用 Flutter

Android 定义插件

class MyFlutterEventPlugin implements EventChannel.StreamHandler {

public EventChannel.EventSink eventSink;

public static MyFlutterEventPlugin registerWith(PluginRegistry registry) {

String CHANNEL = "com.example.flutter_app/event_plugin";

PluginRegistry.Registrar registrar = registry.registrarFor(CHANNEL);

EventChannel eventChannel = new EventChannel(registrar.messenger(), CHANNEL);

MyFlutterEventPlugin myFlutterEventPlugin = new MyFlutterEventPlugin();

eventChannel.setStreamHandler(myFlutterEventPlugin);

return myFlutterEventPlugin;

}

@Override

public void onListen(Object o, EventChannel.EventSink eventSink) {

this.eventSink = eventSink;

}

@Override

public void onCancel(Object o) {

}

}

Android 插件注册 & 调用

public class MainActivity extends FlutterActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

GeneratedPluginRegistrant.registerWith(this);

MyFlutterPlugin.registerWith(this);

MyFlutterEventPlugin eventPlugin = MyFlutterEventPlugin.registerWith(this);

new Thread(new Runnable() {

@Override

public void run() {

int counter = 0;

while (true){

try {

if (eventPlugin.eventSink != null) {

eventPlugin.eventSink.success(counter++);

}

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

eventPlugin.eventSink.error("计时器异常","计时器异常",e.getMessage());

}

}

}

}).start();

}

}

Flutter 注册监听器接收来自原生的消息

static const myEventPlugin = const EventChannel('com.example.flutter_app/event_plugin');

@override

void initState() {

super.initState();

myEventPlugin.receiveBroadcastStream().listen(_onEvent, onError: _onError);

}

void _onEvent(Object event) {

print("onEvent: $event");

}

void _onError(Object error) {

print("onError: $error");

}

完整代码

Android

public class MainActivity extends FlutterActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

GeneratedPluginRegistrant.registerWith(this);

MyFlutterPlugin.registerWith(this);

MyFlutterEventPlugin eventPlugin = MyFlutterEventPlugin.registerWith(this);

new Thread(new Runnable() {

@Override

public void run() {

int counter = 0;

while (true){

try {

if (eventPlugin.eventSink != null) {

eventPlugin.eventSink.success(counter++);

}

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

eventPlugin.eventSink.error("计时器异常","计时器异常",e.getMessage());

}

}

}

}).start();

}

}

class MyFlutterPlugin implements MethodChannel.MethodCallHandler {

private final Activity activity;

public MyFlutterPlugin(Activity activity) {

this.activity = activity;

}

@Override

public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {

if (methodCall.method.equals("getUser")) {

Integer userId = methodCall.argument("userId");

String mockUser = String.format("{\"name\":\"Wiki\",\"id\":%s}", userId);

result.success(mockUser);

}

}

public static void registerWith(PluginRegistry registry) {

String CHANNEL = "com.example.flutter_app/plugin";

PluginRegistry.Registrar registrar = registry.registrarFor(CHANNEL);

MethodChannel methodChannel = new MethodChannel(registrar.messenger(), CHANNEL);

MyFlutterPlugin myFlutterPlugin = new MyFlutterPlugin(registrar.activity());

methodChannel.setMethodCallHandler(myFlutterPlugin);

}

}

class MyFlutterEventPlugin implements EventChannel.StreamHandler {

public EventChannel.EventSink eventSink;

public static MyFlutterEventPlugin registerWith(PluginRegistry registry) {

String CHANNEL = "com.example.flutter_app/event_plugin";

PluginRegistry.Registrar registrar = registry.registrarFor(CHANNEL);

EventChannel eventChannel = new EventChannel(registrar.messenger(), CHANNEL);

MyFlutterEventPlugin myFlutterEventPlugin = new MyFlutterEventPlugin();

eventChannel.setStreamHandler(myFlutterEventPlugin);

return myFlutterEventPlugin;

}

@Override

public void onListen(Object o, EventChannel.EventSink eventSink) {

this.eventSink = eventSink;

}

@Override

public void onCancel(Object o) {

}

}

Flutter 代码

import 'package:flutter/material.dart';

import 'package:flutter/services.dart';

void main() => runApp(MyApp());

class MyHomePageState extends State {

static const myPlugin = const MethodChannel('com.example.flutter_app/plugin');

static const myEventPlugin = const EventChannel('com.example.flutter_app/event_plugin');

@override

void initState() {

super.initState();

myEventPlugin.receiveBroadcastStream().listen(_onEvent, onError: _onError);

}

void _onEvent(Object event) {

print("onEvent: $event");

}

void _onError(Object error) {

print("onError: $error");

}

void getUser() async {

Map map = {"userId": 101};

String result = await myPlugin.invokeMethod("getUser", map);

print(result);

}

@override

Widget build(BuildContext context) {

return new Center(

child: new RaisedButton(

onPressed: () {

getUser();

},

child: new Text("调用原生"),

),

);

}

}

class MyHomePage extends StatefulWidget {

@override

State createState() {

return new MyHomePageState();

}

}

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return new MaterialApp(

title: 'Welcome to Flutter',

home: new Scaffold(

appBar: new AppBar(

title: new Text('Welcome to Flutter'),

),

body: MyHomePage(),

),

);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值