私はフラッターアプリでネイティブAndroid=メソッドを使用していました
MethodChannel(flutterView, CHANNEL).setMethodCallHandler...
しかしflutterをアップグレードした後、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
}
});
}
このメソッドをクラスに追加するだけです。
BinaryMessenger getFlutterView(){
return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
そして、オプションで、すべての(Refactor> Rename) "getFlutterView"を "getBinaryMessenger"に置き換えて、コードを読みやすくします。
BinaryMessenger getBinaryMessenger(){
return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
これを削除import io.flutter.embedding.Android.FlutterActivity;
このインポートを追加io.flutter.app.FlutterActivity;
私のために働いた
Flutter UIを既存のAndroid Appに追加する方法を理解するために何日も費やしました。最大の課題は、MainActivityから呼び出されるFlutterActivityでMethodChannelを機能させることでした。これは少し知っています。ここで尋ねた質問とは異なりますが、この投稿は「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で、既存のアプリを開いた状態で、[ファイル]、[新規]、[新規モジュール]、[フラッターモジュール]をタップしました。エラーを受け取り、手動の手順を実行する必要がありました。
私の目的は、MainActivity-onCreateでFlutterActivity(flutter_moduleのmain.Dartを開きます)を起動し、MethodChannelを使用したプラットフォーム呼び出しを制限して、可能な限り多くのネイティブFlutterコードを活用するFlutter '画面'を開発することです。代替のFlutterコードを開発するときは、既存のAndroidコードをコメントアウトし続けます。
これが最終的に私のために働いたものです:
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’
dependencies {
…
implementation project(':flutter')
}
<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
}