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

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.


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

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

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
  }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.