栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Flutter与原生通信的3种方法(Android)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Flutter与原生通信的3种方法(Android)

Android端代码

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.frameLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.plugin.common.BasicMessageChannel;

public class FlutterAppActivity extends AppCompatActivity implements MessageIO {
    public final static String INIT_PARAMS = "initParams";
    private BasicMessageChannelPlugin basicMessageChannelPlugin;
    private EventChannelPlugin eventChannelPlugin;
    private FlutterEngine flutterEngine;
    private EditText ed;
    private FlutterView flutterView;
    public static void start(Context context, String initParams) {
        Intent intent = new Intent(context, FlutterAppActivity.class);
        intent.putExtra(INIT_PARAMS, initParams);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.flutter_app_activity);
        initView();
        initRegiest();
        initListener();
    }

    private void initRegiest() {
        eventChannelPlugin = EventChannelPlugin.registerWith(flutterEngine, this);
        MethodChannelPlugin.registerWith(flutterView, flutterEngine, this);
        basicMessageChannelPlugin = BasicMessageChannelPlugin.registerWith(flutterView, flutterEngine, this);
    }

    private void initView() {

        String initParams = getIntent().getStringExtra(INIT_PARAMS);
        flutterView = new FlutterView(this);//Flutter.createView(this, getLifecycle(), initParams);
        frameLayout.LayoutParams layout =
                new frameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        frameLayout rootLayout = findViewById(R.id.f_root);
        rootLayout.addView(flutterView, layout);
        // 关键代码,将Flutter页面显示到FlutterView中
        flutterEngine = new FlutterEngine(this);
        flutterEngine.getDartExecutor().executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
        );
        flutterView.attachToFlutterEngine(flutterEngine);
        ed = findViewById(R.id.ed);
    }

    private void initListener() {
        findViewById(R.id.eventChanne).setonClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {
                eventChannelPlugin.send(ed.getText().toString());
            }
        });

        findViewById(R.id.basicMessageChannel).setonClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {
                basicMessageChannelPlugin.send(ed.getText().toString(), new BasicMessageChannel.Reply() {
                    @Override
                    public void reply(@Nullable String reply) {
                        Log.e("","");
                    }
                });
            }
        });
    }
    @Override
    public void onShowMessage(String message) {
        Toast.makeText(this, "Android收到消息 "+message, Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onResume() {
        super.onResume();
        flutterEngine.getLifecycleChannel().appIsResumed();
    }

    @Override
    protected void onPause() {
        super.onPause();
        flutterEngine.getLifecycleChannel().appIsInactive();
    }

    @Override
    protected void onStop() {
        super.onStop();
        flutterEngine.getLifecycleChannel().appIsPaused();
    }
}
import android.app.Activity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.embedding.android.FlutterView;


public class MethodChannelPlugin implements MethodCallHandler {
    private Activity activity;
    private MessageIO messageIO;

    
    public static void registerWith(FlutterView flutterActivity, FlutterEngine flutterEngine, MessageIO messageIO) {
        MethodChannel channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "MethodChannelPlugin");
        MethodChannelPlugin instance = new MethodChannelPlugin((Activity) flutterActivity.getContext(), messageIO);
        channel.setMethodCallHandler(instance);
    }

    private MethodChannelPlugin(Activity activity, MessageIO messageIO) {
        this.activity = activity;
        this.messageIO = messageIO;
    }

    @Override
    public void onMethodCall(MethodCall call, Result result) {
        switch (call.method) {//处理来自Dart的方法调用
            case "send":
                result.success("收到来自Dart的数据:" + call.arguments);//返回结果给Dart
                messageIO.onShowMessage(call.arguments());
                break;
            default:
                result.notImplemented();
        }
    }
}

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.EventChannel;


public class EventChannelPlugin implements EventChannel.StreamHandler {
    private EventChannel.EventSink eventSink;
    private MessageIO messageIO;

    static EventChannelPlugin registerWith(FlutterEngine flutterEngine, MessageIO messageIO) {
        EventChannelPlugin plugin = new EventChannelPlugin(messageIO);
        new EventChannel(flutterEngine.getDartExecutor().getBinaryMessenger(),"EventChannelPlugin").setStreamHandler(plugin);
        return plugin;
    }

    private EventChannelPlugin( MessageIO messageIO) {
        this.messageIO = messageIO;
    }

    void send(Object params) {
        if (eventSink != null) {
            eventSink.success(params);
        }
    }

    @Override
    public void onListen(Object args, EventChannel.EventSink eventSink) {
        this.eventSink = eventSink;
    }

    @Override
    public void onCancel(Object o) {
        eventSink = null;
    }
}
import android.app.Activity;
import android.util.Log;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.BasicMessageChannel;
import io.flutter.plugin.common.StringCodec;


public class BasicMessageChannelPlugin implements
        BasicMessageChannel.MessageHandler, BasicMessageChannel.Reply {
    private final Activity activity;
    private final BasicMessageChannel messageChannel;
    private MessageIO messageIO;

    static BasicMessageChannelPlugin registerWith(FlutterView flutterView, FlutterEngine flutterEngine, MessageIO messageIO) {
        return new BasicMessageChannelPlugin(flutterView, flutterEngine, messageIO);
    }

    private BasicMessageChannelPlugin(FlutterView flutterView, FlutterEngine flutterEngine, MessageIO messageIO) {
        this.activity = (Activity) flutterView.getContext();
        this.messageChannel = new BasicMessageChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "BasicMessageChannelPlugin", StringCodec.INSTANCE);
        //设置消息处理器,处理来自Dart的消息
        messageChannel.setMessageHandler(this);
        this.messageIO = messageIO;
    }

    @Override
    public void onMessage(String s, BasicMessageChannel.Reply reply) {//处理Dart发来的消息
//        reply.reply("BasicMessageChannel收到:" + s);//可以通过reply进行回复
        messageIO.onShowMessage(s);
//        Log.e("","BasicMessageChannel收到:" + s);
    }

    
    void send(String message, BasicMessageChannel.Reply callback) {
        messageChannel.send(message, callback);
    }

    @Override
    public void reply(String s) {
        Log.e("","");
    }
}

Flutter端代码

import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(MyApp(initParams: window.defaultRouteName));

class MyApp extends StatelessWidget {
  final String? initParams;
  const MyApp({Key? key, this.initParams}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 混合开发',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter 混合开发', initParams: this.initParams),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title, required this.initParams})
      : super(key: key);
  final String title;
  final String? initParams;
  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  String showMessage = "";
  String _basicMessageChannelMessage = "";
  String _eventChannelMessage = "";
  static const EventChannel _eventChannelPlugin =
      EventChannel('EventChannelPlugin');
  StreamSubscription? streamSubscription;
  static const MethodChannel _methodChannelPlugin =
      const MethodChannel('MethodChannelPlugin');
  static const BasicMessageChannel _basicMessageChannel =
      const BasicMessageChannel('BasicMessageChannelPlugin', StringCodec());

  _sendMethodChannelMessage() async {
    String response =
        await _methodChannelPlugin.invokeMethod('send', 'MethodMessage 嘿嘿嘿');
  }

  _sendBasicMessageChannel() async {
    var response = await _basicMessageChannel.send('BasicMessageChannel 哈哈哈');
    this._basicMessageChannelMessage = response.toString();
  }

  _sendEventChannelMessage() async {
    var response = await _basicMessageChannel.send('EventMessageChannel 6666');
    this._eventChannelMessage = response.toString();
  }

  @override
  void initState() {
    streamSubscription = _eventChannelPlugin
        .receiveBroadcastStream('嘿嘿嘿')
        .listen(_onToDart, onError: _onToDartError);

    //使用BasicMessageChannel接受来自Native的消息,并向Native回复
    _basicMessageChannel.setMessageHandler((message) async {
      // var response = await _basicMessageChannel.send('送Dart发送消息给 Native');
      setState(() {
        this._basicMessageChannelMessage = message!;
      });
      return "收到Native的消息222:" + message!;
    });
    super.initState();
  }

  void _onToDart(message) {
    setState(() {
      this._eventChannelMessage = message;
    });
  }

  void _onToDartError(error) {
    print(error);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        child: Column(
          // Codrizontal).
          children: [
            Row(
              children: [
                InkWell(
                  onTap: () {
                    this._sendMethodChannelMessage();
                  },
                  child: Text("MethodChannel 发送消息"),
                )
              ],
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                InkWell(
                  onTap: () {
                    this._sendBasicMessageChannel();
                  },
                  child: Text("BasicChannel 发送消息"),
                ),
                Text('Basic收到消息 = ' + _basicMessageChannelMessage)
              ],
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                InkWell(
                  onTap: () {
                    this._sendEventChannelMessage();
                  },
                  child: Text("event 发送消息"),
                ),
                Text('event收到消息 = ' + _eventChannelMessage)
              ],
            )
          ],
        ),
      ),
    );
  }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号