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 WebView解析 调用html5页面
  2. android之activity中onSaveInstanceState和onRestoreInstanceSta
  3. android 实时获取网速
  4. [置顶] android AIDL 进程间通信
  5. android 线程超时的例子
  6. Android中按钮点击后背景改变样式
  7. android视频录制(调用系统视频录制),生成缩略图
  8. Android(安卓)Camera框架分析
  9. Android(安卓)webView中调用JavaScript

随机推荐

  1. Android 的init脚本编写解析
  2. TabHost随着输入法软键盘出现而上浮的问
  3. ionic 发布android,并查看签名文件。
  4. android默认输入法设置
  5. Android PopupWindow的使用
  6. 【Android】Web Console: Uncaught TypeE
  7. Android -- 获取摄像头帧数据解码
  8. Android(安卓)ListView基础篇
  9. Android(安卓)设置ImageView中图片的显示
  10. com.android.support:support-fragment‘