crea il metodo canale dopo aver aggiornato flutter- impossibile risolvere il metodo getFlutterView ()


9

stavo usando il metodo Android nativo nella mia app flutter usando la documentazione che diceva l'uso

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

ma dopo aver aggiornato il flutter la MethodChannelfunzione non è necessaria flutterViewe non esiste flutterViewpiù.

can not resolve method getFlutterView()

penso che ci dovrebbe essere un nuovo tutorial per la creazione di canali

invece ha bisogno di alcuni BinaryMessengerche non so cosa dare invece.

questo è il vecchio codice che non funziona più:

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

Risposte:


16

Sostituisci getFlutterView()con getFlutterEngine().getDartExecutor().getBinaryMessenger().

In realtà non hai bisogno di .getBinaryMessenger()come DartExecutorimplementa BinaryMessenger(semplicemente inoltrando), ma penso che sia più corretto specificare il messenger.


bene ha funzionato bene ma immagino ci siano stati anche alcuni cambiamenti nell'implementazione del metodo, non c'è nessun MethodCallHandler () e onMethodCall () credo.
Mahmood Bkh

Salvavita! Molte grazie! +1
devDeejay


2

Aggiungi semplicemente questo metodo alla tua classe:

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

E facoltativamente sostituisci tutto (Refactor> Rinomina) "getFlutterView" in "getBinaryMessenger" per avere un codice più leggibile:

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

1

Ho trascorso giorni cercando di capire come aggiungere un'interfaccia utente Flutter alla mia app Android esistente. La sfida più grande è stata far funzionare il MethodChannel con FlutterActivity chiamato da MainActivity. So che questo è un po 'diverso dalla domanda posta qui, ma questo post è stato restituito quando ho cercato "Android FlutterActivity MethodChannel". Dopo aver consultato molte risorse su come farlo, ho finalmente trovato la mia soluzione qui: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ esempio / androidusingplugin

Inizialmente, in Android Studio, con l'app esistente aperta, ho toccato File, Nuovo, Nuovo modulo, Modulo Flutter. Ho ricevuto un errore e ho dovuto eseguire passaggi manuali.

Il mio obiettivo è quello di avviare FlutterActivity (apre main.dart nel flutter_module) in MainActivity - onCreate, quindi sviluppare gli 'schermi' di Flutter sfruttando il maggior numero possibile di codice Flutter nativo, con chiamate alla piattaforma limitate utilizzando MethodChannel. Mentre sviluppo il codice Flutter sostitutivo, continuerò a commentare il codice Android esistente.

Ecco cosa ha funzionato finalmente per me:

../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
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.