flutter yükselttikten sonra yöntem kanalı oluşturmak- yöntemi çözemiyorum getFlutterView ()


11

ben kullanım dedi dedi belgeleri kullanarak benim çarpıntı app yerli android yöntemi kullanıyordum

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

ancak çarpıntıyı yükselttikten sonra MethodChannelişlev gerektirmez flutterViewve flutterViewartık yoktur .

can not resolve method getFlutterView()

kanal oluşturmak için yeni bir öğretici olması gerektiğini düşünüyorum

bunun yerine bunun yerine BinaryMessengerne vereceğimi bilmediğim bir yere ihtiyacı var.

bu artık çalışmayan eski kod:

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

Yanıtlar:


18

Değiştir getFlutterView()ile getFlutterEngine().getDartExecutor().getBinaryMessenger().

Aslında .getBinaryMessenger()as DartExecutoraletlerinin BinaryMessengerkendisine (sadece ileterek) ihtiyacınız yoktur, ancak bence elçiyi belirtmek daha doğru olur.


iyi amele para cezası ama yöntem uygulamada bazı değişiklikler oldu sanırım, hiçbir MethodCallHandler () ve onMethodCall () sanırım.
Mahmood Bkh

Cankurtaran! Çok teşekkürler! +1
devDeejay

3

Bu yöntemi sınıfınıza eklemeniz yeterlidir:

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

Ve sonra daha okunabilir bir koda sahip olmak için isteğe bağlı olarak tüm (Refactor> Yeniden Adlandır) "getFlutterView" yerine "getBinaryMessenger" yazın:

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


1

Mevcut Android Uygulamama nasıl bir Çarpıntı UI ekleyeceğimizi anlamaya çalışarak günler geçirdim. En büyük zorluk, MethodChannel'ın MainActivity'den çağrılan FlutterActivity ile çalışmasını sağlamaktı. Bunun burada sorulan sorudan biraz farklı olduğunu biliyorum, ancak 'Android FlutterActivity MethodChannel' için arama yaptığımda bu yazı döndürüldü. Bunu nasıl yapacağım konusunda birçok kaynağa rağmen, sonunda çözümümü burada buldum: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ örneğin, / androidusingplugin

Başlangıçta, Android Studio'da mevcut uygulama açıkken Dosya, Yeni, Yeni Modül, Çırpınma Modülü'ne dokundum. Bir hata aldım ve manuel adımlar uygulamak zorunda kaldım.

Amacım MainActivity - onCreate'de FlutterActivity'yi (flutter_module'de main.dart'ı açar) başlatmak, sonra MethodChannel'i kullanarak sınırlı Platform çağrılarıyla mümkün olduğunca çok yerel Flutter kodu kullanarak Flutter 'ekranlarını' geliştirmek. Yedek Flutter kodunu geliştirdikçe, mevcut Android Kodunu yorumlamaya devam edeceğim.

Sonunda benim için işe yarayan şey:

../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
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.