写点什么

Flutter 与 原生交互(Android),2021 年 BATJ30 套大厂 Android 经典高频面试题

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:1819 字

    阅读完需:约 6 分钟

/**


  • 接收


*/


void receiveMessage(){


messageChannel.setMessageHandler((message) async{


print(message);


return "is ok";


});


}


MethodChannel


=============

flutter 调用 原生

1.实现插件


public class FlutterPluginTest implements MethodChannel.MethodCallHandler {


private static final String TAG = "FlutterPluginTest";


/**


  • 插件标识


*/


public static String CHANNEL = "com.mmd.flutterapp/plugin";


private static String ACTION_LOG = "log";


private static String LOG_ARGUMENT = "data";


static MethodChannel channel;


public static void registerWith(PluginRegistry.Registrar registrar) {


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


FlutterPluginTest instance = new FlutterPluginTest();


channel.setMethodCallHandler(instance);


}


@Override


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


/**


  • 通过 method 判断调用方法


*/


if (methodCall.method.equals(ACTION_LOG)) {


/**


  • 解析参数


*/


String text = methodCall.argument(LOG_ARGUMENT);


if (TextUtils.isEmpty(text)) {


/**


  • 错误返回


*/


result.error("Data is Null",null,null);


}else {


Log.d(TAG, "onMethodCall: "+text);


/**


  • 成功返回


*/


result.success("is ok");


}


}else {


result.notImplemented();


}


}


}


2.注册插件


public class MainActivity extends FlutterActivity {


@Override


protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);


/**


  • 注册插件


*/


FlutterPluginTest.registerWith(this.registrarFor(FlutterPluginTest.CHANNEL));


}


}


3.Flutter 端调用


import 'package:flutter/services.dart';


/**


  • 名称要和 Java 端一致


*/


const channelName = "com.mmd.flutterapp/plugin";


const methodName = "log";


const MethodChannel channel = MethodChannel(channelName);


Future<String> _testLog() async{


Map<String,String> map = {"data":"Flutter Hello !"};


String result = await channel.invokeMethod(methodName,map);


print(result);


}


EventChannel


============

原生发送数据到 Flutter

1.实现插件


public class FlutterPluginEventTest implements EventChannel.StreamHandler {


private static final String TAG = "FlutterPluginEventTest";


public static String CHANNEL = "com.mmd.flutterapp/plugin";


static EventChannel channel;


public static void registerWith(PluginRegistry.Registrar registrar) {


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


FlutterPluginEventTest flutterPluginEventTest = new FlutterPluginEventTest();


channel


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


.setStreamHandler(flutterPluginEventTest);


}


@Override


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


new Thread(new Runnable() {


@Override


public void run() {


while (true) {


try {


Thread.sleep(1000);


eventSink.success(System.currentTimeMillis());


} catch (InterruptedException e) {


eventSink.error("error","error",e.getMessage());


}


}


}


}).start();


}


@Override


public void onCancel(Object o) {


Log.i(TAG, "onCancel: "+o);


}


}


2.注册插件


FlutterPluginEventTest.registerWith(this.registrarFor(FlutterPluginEventTest.CHANNEL));


3.Flutter 接收


import 'dart:async';


import 'package:flutter/services.dart';


/**


  • 名称要和 Java 端一致


*/


const channelName = "com.mmd.flutterapp/plugin";


const EventChannel eventChannel = EventChannel(channelName);


StreamSubscription _subcription = null;


void init(void onEvent(String value),Function onError){


if(_subcription == null) {


_subcription = eventChannel.receiveBroadcastStream().listen(onEvent,onError: onError);


}


}


最后送福利了,现在关注我可以获取包含源码解析,自定义 View,动画实现,架构分享等。内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。大家可以跟我一起探讨,有 flutter—底层开发—性能优化—移动架构—资深 UI 工程师 —NDK 相关专业人员和视频教学资料,还有更多面试题等你来拿



本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Flutter 与 原生交互(Android),2021年BATJ30套大厂Android经典高频面试题