问答

Anroid项目集成FlutterModule,MethodChannel抛MissingPluginExc

作者:admin 2021-07-21 我要评论

在学习 Flutter,被一个问题折腾了好几天了,问题简化如下: Flutter (Channel beta, v1.17.0, on Microsoft Windows [Version 10.0.18362.836], locale zh-CN) ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

在学习 Flutter,被一个问题折腾了好几天了,问题简化如下:

Flutter (Channel beta, v1.17.0, on Microsoft Windows [Version 10.0.18362.836], locale zh-CN)

现有 Android 工程,里面有两个 Activity:

  1. MainActivity,该 Activity 中有一个按钮
  2. NativeActivity 。

然后又按照官方文档集成了 Flutter module,里面有页面 FlutterRoute,FlutterRoute 中有一个按钮。

现在操作逻辑如下: 点击 MainActivity 中的按钮,跳转到 Flutter 页面,然后点击 FlutterRoute 中的按钮,再跳转到 NativeActivity 。

现在 MainActivity 代码如下:

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;


public class MainActivity extends FlutterActivity implements View.OnClickListener, MethodChannel.MethodCallHandler {

    private Button button;
    private static final String CHANNEL_NAME = "TEST_CHANNEL_NAME";
    private MethodChannel channel;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(this);


    }

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME);
        channel.setMethodCallHandler(this);
    }

    @Override
    public void onClick(View v) {
        startActivity(
                FlutterActivity.withNewEngine().build(this)
        );
    }


    @Override
    public void onMethodCall(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) {
        if ("startNativeActivity".equals(methodCall.method)) {
            Intent intent = new Intent(MainActivity.this, NativeActivity.class);
            startActivity(intent);
        }
    }
}

Flutter 代码如下:

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

void main(){
  runApp(
      MaterialApp(
        routes: {
          "/":(BuildContext context)=>FlutterRoute(),
        },
        initialRoute: "/",
      )
  );
}

class FlutterRoute extends StatefulWidget {
  FlutterRouteState createState() {
    return FlutterRouteState();
  }
}

class FlutterRouteState extends State<FlutterRoute> {

  static const channel = MethodChannel("TEST_CHANNEL_NAME");

  Future<void> startNativeActivity() async{
    await channel.invokeMethod("startNativeActivity");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter 页面"),
      ),
      body: Container(
        color: Colors.lightGreenAccent,
        child: Center(
          child: Column(
            children: <Widget>[
              Text("Flutter 页面"),
              MaterialButton(
                color: Colors.redAccent,
                child: Text("跳转到原生 Activity"),
                onPressed: () {
                  startNativeActivity();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在 MainActivity 中点击按钮,可以跳转到 FlutterRoute,但是在 FlutterRoute 中点击按钮跳转到 NativeActivity 的时候却抛出:

E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method startNativeActivity on channel TEST_CHANNEL_NAME)
    #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)
    <asynchronous suspension>
    #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
    #2      FlutterRouteState.startNativeActivity (package:fluttermodule/main.dart:27:19)
    #3      FlutterRouteState.build.<anonymous closure> (package:fluttermodule/main.dart:46:19)
    #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:779:19)
    #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:862:36)
    #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
    #7      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:504:11)
    #8      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:282:5)
    ......

究竟是哪里出了问题啊,折腾好几天了,始终不行,难道 MethodChannel 不是这么用的吗?

百度谷歌官方 githubStackOverflow 搜了个遍。。。

实在没辙了,求点醒求指教,感谢

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • Anroid项目集成FlutterModule,MethodC

    Anroid项目集成FlutterModule,MethodC

  • px单位的字体在大屏多屏幕组合的情况下

    px单位的字体在大屏多屏幕组合的情况下

  • element select下拉框内容选择后回显出

    element select下拉框内容选择后回显出

  • elementUI 项目,服务端渲染页面,页面

    elementUI 项目,服务端渲染页面,页面

腾讯云代理商
海外云服务器