首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振联邦android插件-只见接口方法

颤振联邦android插件-只见接口方法
EN

Stack Overflow用户
提问于 2022-05-12 15:02:01
回答 1查看 211关注 0票数 1

在一个颤振的android插件(联邦)中运行最简单的示例,我一直得到:

代码语言:javascript
复制
MissingPluginException(No implementation found for method getPlatformVersion on channel plugins.mydomain.com/my_package)

就好像它只看到了界面,而没有看到Android插件的实现?

这在Android实现中从未被调用过(参见: Android插件实现)

代码语言:javascript
复制
  static void registerWith() {
    MyPackagePlatform.instance = MyPackageAndroid();
  }

Git克隆

您可以只需git克隆联邦插件,并执行melos bootstrap,然后您应该能够看到运行android示例的错误。

代码语言:javascript
复制
git clone https://github.com/JCzz/my_package

如果您使用Android,只需编辑配置的路径,并运行my_package/example,那么您应该就可以了。

Teaser

包pubspec.yaml:

代码语言:javascript
复制
name: my_package_android
description: A new flutter plugin project.
version: 0.0.1
homepage:

environment:
  sdk: ">=2.16.2 <3.0.0"
  flutter: ">=2.5.0"

dependencies:
  flutter:
    sdk: flutter
  my_package_platform_interface:
    path: ../my_package_platform_interface

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^1.0.0

flutter:
  plugin:
    implements: my_package
    platforms:
      android:
        package: com.example.my_package_android
        pluginClass: MyPackageAndroidPlugin
        dartPluginClass: MyPackageAndroid

接口包:

代码语言:javascript
复制
abstract class MyPackagePlatform extends PlatformInterface {
  MyPackagePlatform() : super(token: _token);

  static MyPackagePlatform _instance = MethodChannelMyPackage();

  static final Object _token = Object();

  static MyPackagePlatform get instance => _instance;

  Future<String?> get platformVersion async {
    throw UnimplementedError('getPlatformVersion property has not been implemented.');
  }

}

Android插件实现:

代码语言:javascript
复制
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:my_package_platform_interface/my_package_platform_interface.dart';

const MethodChannel _channel = MethodChannel('plugins.mydomain.com/my_package_android');

class MyPackageAndroid extends MyPackagePlatform {

  /// Registers this class as the default instance of [UrlLauncherPlatform].
  static void registerWith() {
    MyPackagePlatform.instance = MyPackageAndroid();
  }

  @override
  Future<String?> get platformVersion async {
    final String? version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }

  @override
  Future<bool> canLaunch(String url) async {
    final bool canLaunchSpecificUrl = await _canLaunchUrl(url);
    if (!canLaunchSpecificUrl) {
      final String scheme = _getUrlScheme(url);

      if (scheme == 'http' || scheme == 'https') {
        return await _canLaunchUrl('$scheme://flutter.dev');
      }
    }
    return canLaunchSpecificUrl;
  }

  Future<bool> _canLaunchUrl(String url) {
    return _channel.invokeMethod<bool>(
      'canLaunch',
      <String, Object>{'url': url},
    ).then((bool? value) => value ?? false);
  }

  String _getUrlScheme(String url) {
    final int schemeEnd = url.indexOf(':');
    if (schemeEnd == -1) {
      return '';
    }
    return url.substring(0, schemeEnd);
  }

}

Android本机插件:

代码语言:javascript
复制
package com.example.my_package_android;

import android.app.Activity;
import android.util.Log;

import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
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;

import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/** MyPackageAndroidPlugin */
public class MyPackageAndroidPlugin implements FlutterPlugin, MethodCallHandler {
  private static final String TAG = "MethodCallHandlerImpl";

  private MethodChannel channel;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "plugins.mydomain.com/my_package_android");
    channel.setMethodCallHandler(this);
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("getPlatformVersion")) {
      result.success("Android " + android.os.Build.VERSION.RELEASE);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
   
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-13 22:14:02

重新安装/创建了一个新的设备模拟器,并且在面向应用程序包和示例应用程序中都进行了清理--现在它开始工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72217942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档