criar canal de método após a atualização do flutter - não é possível resolver o método getFlutterView ()

9

Eu estava usando o método Android nativo no meu aplicativo de vibração usando a documentação que dizia uso

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

mas após a atualização do flutter, a MethodChannelfunção não exige flutterViewe não existe flutterViewmais.

can not resolve method getFlutterView()

acho que deveria haver um novo tutorial para criar canal

em vez disso, precisa de alguns BinaryMessengerque não sei o que dar.

este é o código antigo que não está mais funcionando:

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
fonte

Respostas:

16

Substitua getFlutterView()por getFlutterEngine().getDartExecutor().getBinaryMessenger().

Você realmente não precisa do .getBinaryMessenger()quanto DartExecutorimplementos BinaryMessengersi mesmo (por apenas forwarding), mas eu acho que é mais correto para especificar o mensageiro.

Richard Heap
fonte
bem, funcionou bem, mas acho que houve algumas mudanças na implementação do método também, não há MethodCallHandler () e onMethodCall (), eu acho.
Mahmood Bkh
Lifesaver! Muito obrigado! +1
devDeejay 16/04
2

Tire isto import io.flutter.embedding.android.FlutterActivity;

Adicione esta importação io.flutter.app.FlutterActivity;

Trabalhou para mim

Sanskar Tiwari
fonte
De acordo com github.com/flutter/flutter/wiki/…, você é incentivado a usar classes de incorporação
mehrdad seyrafi
2

Basta adicionar este método à sua classe:

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

E, opcionalmente, substitua todos (Refactor> Rename) "getFlutterView" por "getBinaryMessenger" para ter um código mais legível:

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

Passei dias tentando descobrir como adicionar uma interface do usuário do Flutter ao meu aplicativo Android existente. O maior desafio foi conseguir que o MethodChannel funcionasse com o FlutterActivity sendo chamado de MainActivity. Sei que isso é um pouco diferente da pergunta feita aqui, mas esta postagem foi retornada quando fiz pesquisas por 'Android FlutterActivity MethodChannel'. Depois de analisar muitos recursos sobre como fazer isso, finalmente encontrei minha solução aqui: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ example / androidusingplugin

Inicialmente, no Android Studio, com o aplicativo existente aberto, toquei em Arquivo, Novo, Novo módulo, Módulo Flutter. Eu recebi um erro e tive que executar etapas manuais.

Meu objetivo é iniciar o FlutterActivity (abre main.dart no flutter_module) no MainActivity - onCreate e, em seguida, desenvolver 'telas' do Flutter, aproveitando o máximo de código nativo do Flutter possível, com chamadas de plataforma limitadas usando o MethodChannel. À medida que desenvolvo o código Flutter de substituição, continuarei a comentar o código Android existente.

Aqui está o que finalmente funcionou para mim:

../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
fonte