升级颤振后创建方法通道 - 无法解析方法 getFlutterView()
Posted
技术标签:
【中文标题】升级颤振后创建方法通道 - 无法解析方法 getFlutterView()【英文标题】:create method channel after upgrading flutter- can not resolve method getFlutterView() 【发布时间】:2020-04-01 07:47:18 【问题描述】:我在我的颤振应用程序中使用原生 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
);
【问题讨论】:
【参考方案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;
为我工作
【讨论】:
根据github.com/flutter/flutter/wiki/…,我们鼓励您使用嵌入类 我不建议使用这个。不再使用,使用flutter 1.12嵌入式包后。【参考方案4】:只需将此方法添加到您的类中:
BinaryMessenger getFlutterView()
return getFlutterEngine().getDartExecutor().getBinaryMessenger();
然后可选地将所有(重构>重命名)“getFlutterView”替换为“getBinaryMessenger”以获得更可读的代码:
BinaryMessenger getBinaryMessenger()
return getFlutterEngine().getDartExecutor().getBinaryMessenger();
【讨论】:
以上是关于升级颤振后创建方法通道 - 无法解析方法 getFlutterView()的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:升级 Flutter 和 Channel 后无法再构建应用程序
无法解析 URL“https://pub.dartlang.org”。错误 (69):无法“发布升级”颤振工具。 5 秒后重试...(还剩 9 次尝试)