buat saluran metode setelah memutakhirkan flutter- tidak dapat menyelesaikan metode getFlutterView ()

9

Saya menggunakan metode Android asli di aplikasi flutter saya menggunakan dokumentasi yang mengatakan penggunaan

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

tapi setelah memutakhirkan flutter MethodChannelfungsi tidak memerlukan flutterViewdan tidak ada flutterViewlagi.

can not resolve method getFlutterView()

saya pikir harus ada tutorial baru untuk membuat saluran

melainkan membutuhkan beberapa BinaryMessengeryang saya tidak tahu harus memberi apa.

ini adalah kode lama yang tidak berfungsi lagi:

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
                }
            });
}
Mahmood Bkh
sumber

Jawaban:

16

Ganti getFlutterView()dengan getFlutterEngine().getDartExecutor().getBinaryMessenger().

Anda sebenarnya tidak memerlukan .getBinaryMessenger()as DartExecutorimplement BinaryMessengeritu sendiri (hanya dengan meneruskan), tapi saya pikir lebih tepat untuk menentukan messenger.

Richard Heap
sumber
baik itu bekerja dengan baik tetapi saya kira ada beberapa perubahan dalam implementasi metode juga, tidak ada MethodCallHandler () dan onMethodCall () saya kira.
Mahmood Bkh
Penyelamat! Terima kasih banyak! +1
devDeejay
2

Pindahkan ini import io.flutter.embedding.android.FlutterActivity;

Tambahkan impor ini io.flutter.app.FlutterActivity;

Bekerja untukku

Sanskar Tiwari
sumber
Menurut github.com/flutter/flutter/wiki/… Anda dianjurkan untuk menggunakan kelas penyematan
mehrdad seyrafi
2

Cukup tambahkan metode ini ke kelas Anda:

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

Dan kemudian secara opsional ganti semua (Refactor> Ubah nama) "getFlutterView" menjadi "getBinaryMessenger" untuk memiliki kode yang lebih mudah dibaca:

BinaryMessenger getBinaryMessenger(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
mehrdad seyrafi
sumber
1

Saya menghabiskan waktu berhari-hari untuk mencari tahu cara menambahkan Flutter UI ke Aplikasi Android saya yang ada. Tantangan terbesar adalah membuat MethodChannel bekerja dengan FlutterActivity dipanggil dari MainActivity. Saya tahu ini sedikit berbeda dari pertanyaan yang diajukan di sini, tetapi postingan ini dikembalikan ketika saya mencari 'Android FlutterActivity MethodChannel'. Setelah melalui banyak sumber tentang cara melakukan ini, saya akhirnya menemukan solusi saya di sini: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ contoh / android menggunakanplugin

Awalnya, di Android Studio, dengan aplikasi yang ada dibuka, saya mengetuk File, New, New Module, Flutter Module. Saya menerima kesalahan dan harus melakukan langkah-langkah manual.

Tujuan saya adalah meluncurkan FlutterActivity (membuka main.dart di flutter_module) di MainActivity - onCreate, kemudian mengembangkan 'layar' yang meningkatkan sebanyak mungkin kode Flutter asli sebanyak mungkin, dengan panggilan Platform terbatas menggunakan MethodChannel. Saat saya mengembangkan kode Flutter pengganti, saya akan terus mengomentari Kode Android yang ada.

Inilah yang akhirnya berhasil untuk saya:

../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
  }
AndyW58
sumber