Flutter 原生交互采坑

代码参考:从零开始的Flutter之旅: MethodChannel

  • 需求:用户在首页点击返回按钮不关闭应用
  • 实现:重写onWillPop
  • 坑点:①中文网提供的有问题,②网络资源大部分都基于java

先贴一下中文网的写法:点击看看

import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity() : FlutterActivity() {
  private val CHANNEL = "samples.flutter.io/battery"

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)

    MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
      // TODO
    }
  }
}

两个问题

  1. 项目默认引入是io.flutter.embedding.android.FlutterActivity,而不是io.flutter.app.FlutterActivity,采用中文网这个包,会造成各种问题,比如:编译不过、插件异常
  2. 中文网中的调用方法是写在onCreate中,而注册语句是GeneratedPluginRegistrant.registerWith(this),这个是不生效的,实际上应该写在configureFlutterEngine中,不需要实现onCreate

返回按钮不退出功能参考代码

package 你的包
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngine

class MainActivity: FlutterActivity(){

    //通讯名称,回到手机桌面
    private val chanel = "android/back/desktop"
    //返回手机桌面事件
    val eventBackDesktop = "backDesktop"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor, chanel).setMethodCallHandler {methodCall: MethodCall, result: MethodChannel.Result ->
            if (methodCall.method.equals(eventBackDesktop)) {
                moveTaskToBack(false)
                result.success(true)
            }
        }
    }
}

Dart中通讯写法

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

class AndroidBackTop {
  ///通讯名称,回到手机桌面
  static const String chanel = "android/back/desktop";

  //返回手机桌面事件
  static const String eventBackDesktop = "backDesktop";

  ///设置回退到手机桌面
  static Future<bool> backDesktop() async {
    final platform = MethodChannel(chanel);
    try {
      await platform.invokeMethod(eventBackDesktop);
    } on PlatformException catch (e) {
      debugPrint(e.toString());
    }
    return Future.value(false);
  }
}

调用

 return new  WillPopScope(
      onWillPop: AndroidBackTop.backDesktop,
      child: Scaffold(),;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值