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