स्पंदन अपग्रेड करने के बाद मेथड चैनल बनाएं- मेथड को हल नहीं कर सकते getFlutterView ()


10

मैं प्रलेखन का उपयोग करके अपने स्पंदन ऐप में देशी एंड्रॉइड विधि का उपयोग कर रहा था जिसने कहा कि उपयोग करें

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

लेकिन स्पंदन अपग्रेड करने के बाद MethodChannelफ़ंक्शन की आवश्यकता नहीं होती है flutterViewऔर flutterViewअब नहीं है।

can not resolve method getFlutterView()

मुझे लगता है कि चैनल बनाने के लिए एक नया ट्यूटोरियल होना चाहिए

इसके बजाय उसे कुछ चाहिए BinaryMessengerजो मुझे नहीं पता कि इसके बदले क्या देना है।

यह पुराना कोड है जो अब काम नहीं कर रहा है:

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

जवाबों:


17

बदलें getFlutterView()के साथ getFlutterEngine().getDartExecutor().getBinaryMessenger()

आपको वास्तव में स्वयं के .getBinaryMessenger()रूप में (केवल अग्रेषण द्वारा) DartExecutorउपकरणों की आवश्यकता नहीं है BinaryMessenger, लेकिन मुझे लगता है कि दूत को निर्दिष्ट करना अधिक सही है।


अच्छी तरह से यह ठीक काम किया है, लेकिन मुझे लगता है कि विधि कार्यान्वयन में भी कुछ बदलाव थे, कोई MethodCallHandler () और onMethodCall () मुझे लगता है।
महमूद बख

Lifesaver! आपका बहुत बहुत धन्यवाद! +1
देवदीजय

2

हटाए इसे import io.flutter.embedding.android.FlutterActivity;

यह आयात जोड़ें io.flutter.app.FlutterActivity;

मेरे लिए काम किया


के अनुसार github.com/flutter/flutter/wiki/... आप को एम्बेड वर्गों का उपयोग करने के लिए प्रोत्साहित किया जाता
mehrdad seyrafi

2

इस विधि को अपनी कक्षा में जोड़ें:

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

और फिर वैकल्पिक रूप से सभी (Refactor> Rename) को "getFlutterView" को "getBinaryMessenger" में बदलने के लिए एक अधिक पठनीय कोड है:

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

1

मैंने अपने मौजूदा एंड्रॉइड ऐप में फ़्लटर यूआई को जोड़ने का तरीका जानने की कोशिश की। सबसे बड़ी चुनौती मैटरचैट से फ्लटरएक्टिविटी के साथ काम करने के लिए मेथडांचेल को मिल रही थी। मुझे पता है कि यह यहां पूछे गए सवाल से थोड़ा अलग है, लेकिन इस पोस्ट को तब लौटाया गया जब मैंने 'Android FlutterActivity MethodChannel' की खोज की। हालांकि यह करने के लिए कई संसाधनों पर जाने के बाद, मैंने आखिरकार अपना समाधान यहां पाया: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ उदाहरण / androidusingplugin

प्रारंभ में, एंड्रॉइड स्टूडियो में, मौजूदा एप्लिकेशन खुलने के साथ, मैंने फ़ाइल, नया, नया मॉड्यूल, स्पंदन मॉड्यूल टैप किया। मुझे एक त्रुटि मिली और मैनुअल चरणों का प्रदर्शन करना पड़ा।

मेरा उद्देश्य MainActivity में FlutterActivity (main.dart को flutter_module में खोलता है) को लॉन्च करना है - onCreate, उसके बाद जितना संभव हो सके Flutter 'स्क्रीन' leveraging को अधिक से अधिक मूल Flutter कोड विकसित करें, MethodChannel का उपयोग करके सीमित कॉल के साथ। जैसा कि मैंने प्रतिस्थापन फ़्लटर कोड विकसित किया है, मैं मौजूदा एंड्रॉइड कोड पर टिप्पणी करना जारी रखूंगा।

यहाँ मेरे लिए आखिरकार क्या काम किया गया है:

../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
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.