Flutter学习笔记——day2(Flutter与原生Activity之间的通信)


一、消息传递

1、在activity中注册消息通道
class OneActivity : Activity() {
    var messageChannel: BasicMessageChannel<String>? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //确保初始化完成 参数二:可传数据args数组
        FlutterMain.ensureInitializationComplete(applicationContext, null)
        setContentView(R.layout.activity_one)
        var flutterRunArguments = FlutterRunArguments()
        //绑定路径
        flutterRunArguments.bundlePath = FlutterMain.findAppBundlePath(applicationContext)
        //获取入口 main方法
        flutterRunArguments.entrypoint = "main"
        //指定启动one_page页,需要在dart文件中注册Route路径为"one_page"
        flutter_view_1.setInitialRoute("one_page")
        //flutterview 运行设置绑定
        flutter_view_1.runFromBundle(flutterRunArguments)

        //设置消息频道
        messageChannel = BasicMessageChannel(flutter_view_1, "channel_name", StringCodec.INSTANCE)

        messageChannel?.setMessageHandler(object : BasicMessageChannel.MessageHandler<String> {
            override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply<String>?) {
                Log.e("setMessageHandler",p0)
                p1?.reply("")
            }

        })
        //延时发送,确保页面初始化完成后发送数据
        Handler().postDelayed({kotlin.run {
            messageChannel?.send("from one message")
        }},2000)
    }

    override fun onPause() {
        super.onPause()
        flutter_view_1.onPause()
    }

    override fun onPostResume() {
        super.onPostResume()
        flutter_view_1.onPostResume()
    }
}

①:注册消息通道

 /**
 * 初始化通信通道
 * 参数一:FlutterView实例对象
 * 参数二:消息通道名字(key)
 * 参数三:消息解码器(用于处理通信消息类型)
 */
val messageChannel = BasicMessageChannel(flutter_view_1, "channel_name", StringCodec.INSTANCE)

②:处理来自Flutter中的消息

//处理来自Flutter中发送的消息
messageChannel?.setMessageHandler(object : BasicMessageChannel.MessageHandler<String> {
            override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply<String>?) {
                ......//具体处理接收到的从Flutter中发送的消息 p0
                p1?.reply("")
            }
        })

③:发送消息给Flutter

messageChannel?.send("from one message")
2、在dart文件中注册消息通道
import 'package:flutter/material.dart';//新建dart文件页面需要导入的包
import 'package:flutter/services.dart';//消息通道需要导入的包
//可刷新数据的页面需要继承StatefulWidget 
class OnePage extends StatefulWidget {
  @override
  _OnePageState createState() => _OnePageState();
}

class _OnePageState extends State<OnePage> {
 //注册信息通道
  static const BasicMessageChannel<String> platform =
  BasicMessageChannel<String>("channel_name", StringCodec());//注意参数要和activity中一致
  String message = "德玛西亚";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Sample App"),
        ),
        body: Center(child: Text(message))
    );
  }

  Future<String> _handleMessage(String message) async {
    setState(() {
      this.message = message;
    });
    return "";
  }

  //接收到Android activity发送到消息  处理消息
  @override
  void initState() {
    super.initState();
    platform.setMessageHandler(_handleMessage);
  }
}

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
//不刷新页面数据
class OnePage extends StatelessWidget {
  static const BasicMessageChannel<String> messageChannel=
  BasicMessageChannel<String>("channel_name", StringCodec());

  @override
  Widget build(BuildContext context) {
    messageChannel.setMessageHandler(_handleMessage);
    return Scaffold(
        appBar: AppBar(
          title: Text("Sample App"),
        ),
        body: Center(child: Text("德玛"))
    );
  }

  Future<String> _handleMessage(String message) async {
    print("===== 接收到了:$message");
    return "";
  }
}

①:注册消息通道

//注册信息通道
  static const BasicMessageChannel<String> messageChannel=
  BasicMessageChannel<String>("channel_name", StringCodec());//注意参数要和activity中一致

②:处理接收到的消息

  //接收到Android activity发送到消息  处理消息
  messageChannel.setMessageHandler(_handleMessage);
  
  Future<String> _handleMessage(String message) async {
    setState(() {
      this.message = message;
    });
    return "";
  }

③:发送消息到Activity

 messageChannel.send("from flutter message");

二、Flutter启动新页面

1、启动Flutter页面
import 'package:flutter/material.dart';
import 'package:flutter_app/one.dart';
import 'package:flutter_app/test.dart';

void main() {
  runApp(FlutterView());
}

class FlutterView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FlutterView',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(),
        routes: <String, WidgetBuilder> {
          'first_page': (BuildContext context) => FirstPage(),
          'one_page' : (BuildContext context) => OnePage(),
        }
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
     @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            child: Center(
              child: Text(
                '德玛西亚',
                style: const TextStyle(fontSize: 17.0),
              ),
            ),
          ),
          RaisedButton(
            child: const Text('one_page'),
            onPressed: () {
              Navigator.of(context).pushNamed("one_page");
            },
          ),
          RaisedButton(
            child: const Text('first_page'),
            onPressed: () {
              Navigator.of(context).pushNamed("first_page");
            },
          ),
        ],
      ),
    );
  }
}  

①:启动Flutter页面

Navigator.of(context).pushNamed(route);//传入在routes中声明的页面路径
2、启动Activity页面
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(FlutterView());
}

class FlutterView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'FlutterView',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const demoPlugin = const MethodChannel('start_acticity');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            child: Center(
              child: Text(
                '德玛西亚',
                style: const TextStyle(fontSize: 17.0),
              ),
            ),
          ),
          RaisedButton(
            child: const Text('启动原生页面'),
            onPressed: () {
              // Perform some action
              demoPlugin.invokeMethod('startActivity');
            },
          ),
        ],
      ),
    );
  }
}

①:在activity中声明方法通道

  // 自定义方法通道,实现原生页面跳转
    MethodChannel(flutterView, “start_acticity”).setMethodCallHandler(object : MethodCallHandler {
      override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == "startActivity") {
          val intent = Intent(this@MainActivity, OneActivity::class.java)
          this@MainActivity.startActivity(intent)
          result.success("success")
        } else {
          result.notImplemented()
        }
      }
    })

②:在dart文件中注册方法通道

static const startActivity= const MethodChannel('start_acticity');

③:在dart文件中跳转原生页面

 startActivity.invokeMethod('startActivity');

参考

flutter与原生activity 交互 数据传递(一):https://blog.csdn.net/DeckeDeng/article/details/84991937

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值