tạo kênh phương thức sau khi nâng cấp flutter- không thể giải quyết phương thức getFlutterView ()


9

tôi đã sử dụng phương pháp Android gốc trong ứng dụng rung của mình bằng tài liệu cho biết sử dụng

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

nhưng sau khi nâng cấp, MethodChannelchức năng không yêu cầu flutterViewvà không flutterViewcòn nữa.

can not resolve method getFlutterView()

tôi nghĩ nên có một hướng dẫn mới để tạo kênh

thay vào đó nó cần một số BinaryMessengerthứ mà tôi không biết nên tặng cái gì.

đây là mã cũ không còn hoạt động nữa:

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

Câu trả lời:


15

Thay thế getFlutterView()bằng getFlutterEngine().getDartExecutor().getBinaryMessenger().

Bạn thực sự không cần thực hiện .getBinaryMessenger()như chính nó (chỉ bằng cách chuyển tiếp), nhưng tôi nghĩ việc xác định trình nhắn tin là chính xác hơn.DartExecutorBinaryMessenger


nó cũng hoạt động tốt nhưng tôi đoán cũng có một số thay đổi trong việc thực hiện phương thức, tôi không đoán được MethodCallHandler () và onMethodCall ().
Mahmood Bkh

Phao cứu sinh! Cảm ơn rất nhiều! +1
devDeejay


2

Chỉ cần thêm phương thức này vào lớp của bạn:

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

Và sau đó tùy ý thay thế tất cả (Refactor> Đổi tên) "getFlutterView" thành "getBinaryMesbah" để có mã dễ đọc hơn:

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

1

Tôi đã dành nhiều ngày cố gắng tìm ra cách thêm UI Flutter vào Ứng dụng Android hiện tại của mình. Thách thức lớn nhất là làm cho Phương thức hoạt động với FlutterActivity được gọi từ MainActivity. Tôi biết điều này hơi khác so với câu hỏi được hỏi ở đây, nhưng bài đăng này đã được trả lại khi tôi thực hiện tìm kiếm 'Android FlutterActivity MethodChannel'. Sau khi tìm hiểu nhiều tài nguyên về cách thực hiện việc này, cuối cùng tôi đã tìm thấy giải pháp của mình tại đây: https://github.com/flutter/samples/tree/master/add_to_app/android_USE_plugin/app/src/main/java/dev/flutter/ ví dụ / androidUSEplugin

Ban đầu, trong Android Studio, với ứng dụng hiện có được mở, tôi đã gõ Tệp, Mới, Mô-đun mới, Mô-đun Flutter. Tôi đã nhận được một lỗi và phải thực hiện các bước thủ công.

Mục tiêu của tôi là khởi chạy FlutterActivity (mở main.dart trong flutter_module) trong MainActivity - onCreate, sau đó phát triển Flutter 'màn hình' tận dụng càng nhiều mã Flutter gốc càng tốt, với các lệnh gọi Nền tảng giới hạn sử dụng Phương thức kênh. Khi tôi phát triển mã Flutter thay thế, tôi sẽ tiếp tục nhận xét về Mã Android hiện có.

Đây là những gì cuối cùng đã làm việc cho tôi:

../App_Project/Android/Ex hiện_Android_App / sinstall.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/Ex hiện_Android_App / app / build.gradle

dependencies {
…
    implementation project(':flutter')
}

../App_Project/Android/Ex hiện_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/Ex hiện_Android_App / app / src / main / java / com / ex hiện_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
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.