【问题标题】:create method channel after upgrading flutter- can not resolve method getFlutterView()升级颤振后创建方法通道 - 无法解析方法 getFlutterView()
【发布时间】:2026-01-21 23:10:01
【问题描述】:

我在我的颤振应用程序中使用原生 android 方法,使用的文档说使用

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

但升级颤振后MethodChannel函数不需要flutterView和 没有flutterView了。

can not resolve method getFlutterView()

我认为应该有一个创建频道的新教程

相反,它需要一些BinaryMessenger,我不知道该给什么。

这是不再工作的旧代码:

import io.flutter.app.FlutterActivity;
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;

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.dev/battery";

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall call, Result result) {
                    // Note: this method is invoked on the main thread.
                    // TODO
                }
            });
}

【问题讨论】:

    标签: android flutter flutter-channel


    【解决方案1】:

    getFlutterView() 替换为getFlutterEngine().getDartExecutor().getBinaryMessenger()

    您实际上并不需要.getBinaryMessenger(),因为DartExecutor 实现了BinaryMessenger 本身(仅通过转发),但我认为指定信使更正确。

    【讨论】:

    • 它工作得很好,但我想方法实现也有一些变化,我猜没有 MethodCallHandler() 和 onMethodCall()。
    • 救命稻草!非常感谢! +1
    • 是否可以在扩展 YouTubeBaseActivity 而不是 FlutterActivity 的活动中获取 FlutterEngine 和 BinaryMessenger?
    • 无法解析 getFlutterEngine()。我正在使用 kotlin 顺便说一句。
    【解决方案2】:

    我花了几天时间试图弄清楚如何将 Flutter UI 添加到我现有的 Android 应用程序中。最大的挑战是让 MethodChannel 与从 MainActivity 调用的 FlutterActivity 一起工作。我知道这与这里提出的问题有点不同,但是当我搜索“Android FlutterActivity MethodChannel”时,返回了这篇文章。在浏览了很多关于如何做到这一点的资源之后,我终于在这里找到了我的解决方案: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/example/androidusingplugin

    最初,在 Android Studio 中,打开现有应用程序后,我依次点击 File、New、New Module、Flutter Module。我收到一个错误,必须执行手动步骤。

    我的目标是在 MainActivity - onCreate 中启动 FlutterActivity(在 flutter_module 中打开 main.dart),然后利用尽可能多的原生 Flutter 代码开发 Flutter“屏幕”,并使用 MethodChannel 进行有限的平台调用。在开发替代 Flutter 代码时,我将继续注释掉现有的 Android 代码。

    这是最终对我有用的方法:

    ../App_Project/Android/Existing_Android_App/settings.gradle

    include ':app'
    setBinding(new Binding([gradle: this]))
    evaluate(new File(settingsDir.parentFile, '../flutter_module/.android/include_flutter.groovy'))
    include ':flutter_module’
    project(':flutter_module’).projectDir = new File('../../flutter_module’)
    rootProject.name=‘existing_android_app’
    

    ../App_Project/Android/Existing_Android_App/app/build.gradle

    dependencies {
    …
        implementation project(':flutter')
    }
    

    ../App_Project/Android/Existing_Android_App/app/src/main/AndroidManifest.xml

    <activity
        android:name="io.flutter.embedding.android.FlutterActivity"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize" />
    

    ../App_Project/Android/Existing_Android_App/app/src/main/java/com/existing_android_app/MainActivity.java

    package com.existing_android_app;
    
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import io.flutter.embedding.android.FlutterActivity;
    import io.flutter.embedding.engine.FlutterEngine;
    import io.flutter.embedding.engine.FlutterEngineCache;
    import io.flutter.embedding.engine.dart.DartExecutor;
    import io.flutter.plugin.common.MethodCall;
    import io.flutter.plugin.common.MethodChannel;
    
    public class MainActivity extends AppCompatActivity {
    
        final String ENGINE_ID = "1";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            FlutterEngine flutterEngine = new FlutterEngine(this);
            flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
    
            FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine);
    
            MethodChannel channel = new MethodChannel(flutterEngine.getDartExecutor(), "com.existing_android_app/myMethodChannel");
    
            channel.setMethodCallHandler(
                    new MethodChannel.MethodCallHandler() {
                        @Override
                        public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
                            String url = call.argument("url");
                            if (call.method.equals("openBrowser")) {
                                openBrowser(url);
                            } 
                              else {
                                result.notImplemented();
                            }
                        }
                    });
    
            startActivity(FlutterActivity.withCachedEngine(ENGINE_ID).build(this));
        }
    
        void openBrowser(String url) {
    
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
    
            this.startActivity(intent);
        }
    }
    

    ../App_Project/flutter_module/lib/home_page.dart

    class AppHomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<AppHomePage> {
    
      static const platform = const MethodChannel(‘com.existing_android_app/myMethodChannel’);
    
      Future<void> _openBrowser() async {
        try {
          final int result = await platform.invokeMethod('openBrowser', <String, String> { 'url': "http://bing.com” });
        }
        catch (e) {
          print('***** _openBrowser error: ' + e.toString());
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            appBar: CustomAppBar(),
            body: Column(
              children: <Widget>[
                RaisedButton(
                  label: Text('Search',
                    style: TextStyle(fontSize: 18.0),
                  ),
                  onPressed: () {  _openBrowser(); },
                ) // RaisedButton.icon
              ], // Widget
            ) // Column
          ) // Scaffold
        ); // SafeArea
      }
    

    【讨论】:

      【解决方案3】:

      删除这个import io.flutter.embedding.android.FlutterActivity;

      添加此导入io.flutter.app.FlutterActivity;

      为我工作

      【讨论】:

      【解决方案4】:

      只需将此方法添加到您的类中:

      BinaryMessenger getFlutterView(){
          return getFlutterEngine().getDartExecutor().getBinaryMessenger();
      }
      

      然后可选地将所有(重构>重命名)“getFlutterView”替换为“getBinaryMessenger”以获得更可读的代码:

      BinaryMessenger getBinaryMessenger(){
          return getFlutterEngine().getDartExecutor().getBinaryMessenger();
      }
      

      【讨论】: