升级flutter后创建方法通道-无法解析方法getFlutterView()

时间:2019-12-07 16:25:31

标签: android flutter flutter-channel

我在flutter应用程序中使用了本机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
                }
            });
}

4 个答案:

答案 0 :(得分:3)

删除此import io.flutter.embedding.android.FlutterActivity;

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

为我工作

答案 1 :(得分:3)

只需将此方法添加到您的课程中即可:

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

然后有选择地将所有(重构>重命名)“ getFlutterView”替换为“ getBinaryMessenger”,以使代码更具可读性:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我花了几天时间试图弄清楚如何将Flutter UI添加到我现有的Android App中。最大的挑战是要使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),然后利用MethodChannel在有限的平台调用下,利用尽可能多的本机Flutter代码开发Flutter“屏幕”。在开发替换的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
  }