Android 升级颤振后创建方法通道-无法解析方法GetFlatterView()

Android 升级颤振后创建方法通道-无法解析方法GetFlatterView(),android,flutter,flutter-channel,Android,Flutter,Flutter Channel,我在我的Flitter应用程序中使用的是原生android方法,使用的文档是 MethodChannel(flutterView, CHANNEL).setMethodCallHandler... 但是升级颤振后,MethodChannel功能不需要flatterview和 不再有视图 can not resolve method getFlutterView() 我认为应该有一个新的教程来创建频道 相反,它需要一些BinaryMessenger,我不知道该给它什么 这是不再工作的旧代码:

我在我的Flitter应用程序中使用的是原生android方法,使用的文档是

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...
但是升级颤振后,
MethodChannel
功能不需要
flatterview
和 不再有
视图

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
                }
            });
}

getflatterview()
替换为
getflatterengine().getDartExecutor().getBinaryMessenger()


实际上,您不需要
.getBinaryMessenger()
作为
DartExecutor
实现
BinaryMessenger
本身(通过转发),但我认为指定messenger更为正确。

我花了几天时间试图找出如何在我现有的Android应用程序中添加颤振UI。最大的挑战是让MethodChannel与从MainActivity调用的活动一起工作。我知道这和这里的问题有点不同,但这篇文章是在我搜索“Android频道”时返回的。在阅读了许多关于如何实现这一点的资源后,我终于在这里找到了解决方案:

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

我的目标是在MainActivity-onCreate中启动颤振活动(在颤振_模块中打开main.dart),然后利用尽可能多的本地颤振代码开发颤振“屏幕”,使用MethodChannel进行有限的平台调用。在我开发替换颤振代码时,我将继续注释现有的Android代码

以下是最终对我有效的方法:

../App\u Project/Android/Existing\u Android\u App/settings.gradle ../App\u Project/Android/Existing\u Android\u App/App/build.gradle ../App_Project/Android/Existing_Android_App/App/src/main/AndroidManifest.xml ../App\u Project/flatter\u module/lib/home\u page.dart
class AppHomePage扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
static const platform=const MethodChannel('com.existing_android_app/myMethodChannel');
Future\u openBrowser()异步{
试一试{
final int result=wait platform.invokeMethod('openBrowser',{'url':'http://bing.com” });
}
捕获(e){
打印('*****U openBrowser错误:'+e.toString());
}
}
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
appBar:CustomAppBar(),
正文:专栏(
儿童:[
升起的按钮(
标签:文本('搜索',
样式:TextStyle(fontSize:18.0),
),
按下:({u openBrowser();}),
)//RaisedButton.icon
],//小部件
)//列
)//脚手架
);//安全区
}

删除此
导入io.flatter.embedding.android.flatterActivity;

添加此导入
io.flatter.app.flatterActivity;


为我工作

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

BinaryMessenger getFlutterView(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
然后可选地将所有(重构>重命名)“GetView”替换为“getBinaryMessenger”,以获得更可读的代码:

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

它工作得很好,但我想在方法实现中也有一些变化,没有MethodCallHandler()和onMethodCall()我猜。救生员!非常感谢!+1在扩展
YouTubeBaseActivity
而不是
flatteractivity
的活动中,有可能获得flatterengine和BinaryMessenger吗?无法解析GetFlatterengine().顺便说一句,我正在使用kotlin。根据您的说法,我们鼓励您使用嵌入类。我不建议您使用该类。在使用Flatter 1.12嵌入包后,不再使用它。
<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" />
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);
    }
}
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
  }
BinaryMessenger getFlutterView(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
BinaryMessenger getBinaryMessenger(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}