utworzyć kanał metod po aktualizacji trzepotania - nie można rozwiązać metody getFlutterView ()


9

używałem natywnej metody Androida w mojej aplikacji do trzepotania, korzystając z dokumentacji, która mówiła o użyciu

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

ale po aktualizacji trzepotanie MethodChannelfunkcja nie wymaga flutterViewi nie ma jej flutterViewjuż.

can not resolve method getFlutterView()

Myślę, że powinien być nowy samouczek dotyczący tworzenia kanału

zamiast tego potrzebuje trochę, BinaryMessengerktórych nie wiem, co dać.

to jest stary kod, który już nie działa:

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

Odpowiedzi:


15

Wymień getFlutterView()się getFlutterEngine().getDartExecutor().getBinaryMessenger().

W rzeczywistości nie potrzebujesz samych narzędzi .getBinaryMessenger()as (tylko przesyłając dalej), ale myślę, że bardziej poprawne jest określenie komunikatora.DartExecutorBinaryMessenger


dobrze działało dobrze, ale myślę, że zaszły także pewne zmiany w implementacji metody, nie ma metody MethodCallHandler () i onMethodCall ().
Mahmood Bkh

Ratownik! Wielkie dzięki! +1
devDeejay


2

Po prostu dodaj tę metodę do swojej klasy:

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

A następnie opcjonalnie zamień wszystkie (get> Zmień nazwę) „getFlutterView” na „getBinaryMessenger”, aby mieć bardziej czytelny kod:

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

1

Spędziłem dni próbując wymyślić, jak dodać interfejs Flutter do mojej istniejącej aplikacji na Androida. Największym wyzwaniem było zmuszenie MethodChannel do współpracy z FlutterActivity wywoływanym z MainActivity. Wiem, że to trochę inne niż pytanie tutaj zadane, ale ten post został zwrócony, kiedy szukałem „Android FlutterActivity MethodChannel”. Po przejrzeniu wielu zasobów, jak to zrobić, w końcu znalazłem tutaj moje rozwiązanie: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ przykład / androidusingplugin

Początkowo w Android Studio, z otwartą istniejącą aplikacją, dotknąłem Plik, Nowy, Nowy moduł, Moduł trzepotania. Wystąpił błąd i musiałem wykonać ręczne czynności.

Moim celem jest uruchomienie FlutterActivity (otwiera main.dart w module flutter_module) w MainActivity - onCreate, a następnie opracowywanie ekranów Fluttera przy użyciu możliwie największej liczby rodzimych kodów Flutter, z ograniczoną liczbą wywołań platformy za pomocą MethodChannel. W trakcie opracowywania zastępczego kodu Flutter będę nadal komentować istniejący kod Androida.

Oto, co w końcu dla mnie zadziałało:

../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
  }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.