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(),      ),    );  }}

更多相关文章

  1. Android自定义Toast 解决关闭通知 Toast无法弹出
  2. 高德地图Android,绘制自定义定位蓝点、marker、面
  3. Android 仿 Iphone 自定义滚条视图(wheelview)
  4. android 自定义View 对话框
  5. android 自定义相册 多选
  6. Android 自定义水平滚动的容器
  7. 自定义ProgressBar的图片
  8. CheckBox自定义样式

随机推荐

  1. [android]gsm smsmessage 类部分详解
  2. Android(安卓)Menu菜单的编写及事件响应
  3. android retrofit2 如何多文件上传
  4. android中读取assets中的文件
  5. 通过adb shell命令查看当前与用户交互的
  6. Android(安卓)布局学习
  7. android 比较靠谱的图片压缩
  8. android 判断当前application 是在前台还
  9. Android(安卓)各版本对应API以及相关特性
  10. android 启动时的短暂黑屏解决