ফ্লাটার আপগ্রেড করার পরে পদ্ধতি চ্যানেল তৈরি করুন- getFlutterView () পদ্ধতিটি সমাধান করতে পারে না


9

আমি আমার ফ্লাটার অ্যাপে নেটিভ অ্যান্ড্রয়েড পদ্ধতি ব্যবহার করছিলাম যা ডকুমেন্টেশন ব্যবহার করে বলছিল

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

উত্তর:


15

getFlutterView()সঙ্গে প্রতিস্থাপন getFlutterEngine().getDartExecutor().getBinaryMessenger()

আপনি আসলে প্রয়োজন না .getBinaryMessenger()যেমন DartExecutorকার্যকরী BinaryMessengerনিজেই (ঠিক ফরওয়ার্ড করার মাধ্যমে), কিন্তু আমার মনে হয় এটা রসূল নির্দিষ্ট করার আরো সঠিক নয়।


এটি বেশ ভাল কাজ করেছে তবে আমি অনুমান করি যে পদ্ধতি বাস্তবায়নেও কিছু পরিবর্তন হয়েছে, আমার মনে হয় কোনও মেথডাক্যালহ্যান্ডলার () এবং onMethodCall () নেই।
মাহমুদ বখ

Lifesaver হয়! অনেক ধন্যবাদ! +1
দেবদিজেয়

2

এটা সরাও import io.flutter.embedding.android.FlutterActivity;

এই আমদানি যুক্ত করুন io.flutter.app.FlutterActivity;

আমার জন্য কাজ


Github.com/flutter/flutter/wiki/… অনুসারে আপনাকে এম্বেডিং ক্লাস ব্যবহার করতে উত্সাহিত করা হচ্ছে
মেহেরদাড সেয়েরাফি

2

আপনার ক্লাসে কেবল এই পদ্ধতিটি যুক্ত করুন:

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

এবং তারপরে আরও পঠনযোগ্য কোড পাওয়ার জন্য সমস্ত (রিফ্যাক্টর> পুনঃনামকরণ) "getFlutterView" কে "getBinaryMes यात्रा" এ প্রতিস্থাপন করুন:

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

1

আমি আমার বিদ্যমান অ্যান্ড্রয়েড অ্যাপে কীভাবে কোনও ঝাঁকুনির UI যুক্ত করতে পারি তা জানার চেষ্টা করে দিন কাটিয়েছি। সবচেয়ে বড় চ্যালেঞ্জটি ছিল মেথাক্যানেলটি ফ্লুটারএকটিভিটির সাথে মেইনএ্যাকটিভিটি থেকে কল করা নিয়ে কাজ করা। আমি জানি এখানে জিজ্ঞাসা করা প্রশ্নের তুলনায় এটি কিছুটা আলাদা, তবে আমি যখন 'অ্যান্ড্রয়েড ফ্লিটারঅ্যাক্টিভিটি মেথডচ্যানেল' অনুসন্ধান করেছিলাম তখন এই পোস্টটি ফিরে আসে। এটি করার জন্য অনেক সংস্থান থাকলেও শেষ পর্যন্ত আমি আমার সমাধান এখানে পেয়েছি: https://github.com/flutter/sample/tree/master/add_to_app/android_ using_plugin app src main java dev flutter/ উদাহরণস্বরূপ / androidusingplugin

প্রাথমিকভাবে, অ্যান্ড্রয়েড স্টুডিওতে বিদ্যমান অ্যাপ্লিকেশনটি খোলার সাথে সাথে আমি ফাইল, নতুন, নতুন মডিউল, ফ্লার্ট মডিউলটি ট্যাপ করেছি app আমি একটি ত্রুটি পেয়েছি এবং ম্যানুয়াল পদক্ষেপগুলি সম্পাদন করতে হয়েছিল।

আমার উদ্দেশ্য হ'ল ফ্লাটারএকটিভিটি চালু করুন (মেইনঅ্যাক্টিভিটিতে ফ্লাটার_মডিউলে মেইন.ডার্ট খুলবে) - অনক্রিট, তারপরে মেথডচ্যানেলটি ব্যবহার করে সীমিত প্ল্যাটফর্ম কলগুলি দিয়ে যতটা সম্ভব নেটিভ ফ্লটার কোড ব্যবহার করে ফ্লাটার 'স্ক্রিনগুলি' বিকাশ করুন। আমি প্রতিস্থাপন ফ্লটার কোডটি বিকাশ করার সাথে সাথে আমি বিদ্যমান অ্যান্ড্রয়েড কোডটির বিষয়ে মন্তব্য করা চালিয়ে যাব।

অবশেষে আমার জন্য যা কাজ করেছে তা এখানে:

../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
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.