7

我在这里尝试示例https://flutter.dev/docs/development/platform-integration/platform-channels#step-1-create-a-new-app-project

但如果我输入完全相同的代码,它就不起作用。(我正在使用 Kotlin)

当我尝试

GeneratedPluginRegistrant.registerWith(this)
MethodChannel(flutterView, CHANNEL)

错误说

类型不匹配:推断类型为 MainActivity 但应为 FlutterEngine

未解决的参考:flutterView

所以我在下面尝试过

GeneratedPluginRegistrant.registerWith(FlutterEngine(this))
MethodChannel(FlutterView(this), CHANNEL)

它使错误消失了,但出现了另一个问题

[错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:MissingPluginException(在通道 samples.flutter.io/battery 上找不到方法 getBatteryLevel 的实现)

虽然 getBatteryLevel() 方法存在

    private fun getBatteryLevel(): Int {
        val batteryLevel: Int
        if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP){
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        } else  {
            val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
            batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
        }
        return batteryLevel
    }

我也试过 getFlutterView(),没用。

这是我想知道的一点。

  1. GeneratedPluginRegistrant 和 MethodChannel 的错误解决得好吗?我的意思是,这是正确的解决方法吗?如果没有,输入什么作为参数?
  2. 我不知道在错误 MissingPluginException 之后该怎么做。我应该构建插件吗?或者有没有办法解决这个问题?

这是完整的代码和错误

主要.dart

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  static const platform = const MethodChannel('samples.flutter.io/battery');
  String _batteryLevel = 'Unknown battery level. ';

  Future<void> _getBatteryLevel() async {
    String batteryLevel;
    try {
      final int result = await platform.invokeMethod('getBatteryLevel');
      batteryLevel = 'Battery level at $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }

    setState(() {
      _batteryLevel = batteryLevel;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text('Get Battery Level'),
              onPressed: _getBatteryLevel,
            ),
            Text(
              _batteryLevel,
            ),
          ],
        ),
      ),
    );
  }
}

MainActivity.kt

package com.example.native_test


import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Bundle
import io.flutter.Log
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.view.FlutterView
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES



class MainActivity: FlutterActivity() {

    //private val CHANNEL = "plugins.flutter.io/battery"
    private val CHANNEL = "samples.flutter.io/battery"
    //private val CHANNEL = "com.example.batterylevel/battery"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.i("user_debug", "MainActivity: onCreate")

        GeneratedPluginRegistrant.registerWith(FlutterEngine(this))
        MethodChannel(FlutterView(this), CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel : Int = getBatteryLevel()

                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "Battery level not available.", null)
                }
            } else {
                Log.e("user_debug", "getBatteryLevel is not method of called")
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        val batteryLevel: Int
        if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP){
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        } else  {
            val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
            batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
        }
        return batteryLevel
    }
}
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Running Gradle task 'assembleDebug'...
E/flutter (23141): [ERROR:flutter/shell/common/shell.cc(197)] Dart Error: Unhandled exception:
E/flutter (23141): NoSuchMethodError: No top-level getter '' declared.
E/flutter (23141): Receiver: top-level
E/flutter (23141): Tried calling: 
E/flutter (23141): #0      NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:202:5)
E/flutter (23141): [ERROR:flutter/runtime/dart_isolate.cc(461)] Could not resolve main entrypoint function.
E/flutter (23141): [ERROR:flutter/shell/common/engine.cc(205)] Could not run the isolate.
E/flutter (23141): [ERROR:flutter/shell/common/engine.cc(137)] Engine not prepare and launch isolate.
E/flutter (23141): [ERROR:flutter/shell/common/shell.cc(197)] Dart Error: Unhandled exception:
E/flutter (23141): NoSuchMethodError: No top-level getter '' declared.
E/flutter (23141): Receiver: top-level
E/flutter (23141): Tried calling: 
E/flutter (23141): #0      NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:202:5)
E/flutter (23141): [ERROR:flutter/runtime/dart_isolate.cc(461)] Could not resolve main entrypoint function.
E/flutter (23141): [ERROR:flutter/shell/common/engine.cc(205)] Could not run the isolate.
E/flutter (23141): [ERROR:flutter/shell/common/engine.cc(137)] Engine not prepare and launch isolate.


...


E/flutter (23861): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getBatteryLevel on channel samples.flutter.dev/battery)
E/flutter (23861): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:319:7)
E/flutter (23861): <asynchronous suspension>
E/flutter (23861): #1      _MyHomePageState._getBatteryLevel (package:native_test/main.dart:55:41)
E/flutter (23861): #2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (23861): #3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (23861): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (23861): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (23861): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (23861): #7      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (23861): #8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (23861): #9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (23861): #10     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (23861): #11     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (23861): #12     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (23861): #13     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (23861): #14     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (23861): #15     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (23861): #16     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (23861): #17     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (23861): #18     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (23861): #19     _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (23861): #20     _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (23861): #21     _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (23861): #22     _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (23861): #23     _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (23861): 
E/flutter (23861): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getBatteryLevel on channel samples.flutter.dev/battery)


...


E/flutter (  770): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:319:7)
E/flutter (  770): <asynchronous suspension>
E/flutter (  770): #1      _MyHomePageState._getBatteryLevel (package:native_test/main.dart:56:41)
E/flutter (  770): #2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (  770): #3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (  770): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (  770): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (  770): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (  770): #7      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (  770): #8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (  770): #9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (  770): #10     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (  770): #11     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (  770): #12     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (  770): #13     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (  770): #14     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (  770): #15     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (  770): #16     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (  770): #17     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (  770): #18     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (  770): #19     _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (  770): #20     _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (  770): #21     _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (  770): #22     _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (  770): #23     _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (  770): 
✓ Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk...
Syncing files to device Android SDK built for x86...

4

5 回答 5

11

添加<meta-data android:name="flutterEmbedding" android:value="2"/>到 AndroidManifest.xml。

于 2020-02-11T16:43:10.487 回答
4

老实说,因为这个错误,我很生气......

我不知道我的做法是否正确,但是......为了让它发挥作用,我不得不将其更改为:

GeneratedPluginRegistrant.registerWith(new FlutterEngine(this));

此外,await platform.invokeListMethod('getBatteryLevel');等待 Future<List<dynamic>>

所以我不得不改变java代码来返回List。

添加了导入

import java.util.List;

将代码行更改为:

List<Integer> batteryLevel = getBatteryLevel();

在该方法调用中,我将代码更改为:

   private List<Integer> getBatteryLevel() {
        List<Integer> result = new ArrayList<>();
        int batteryLevel = -1;
...
   result.add(batteryLevel);
        return result;
    }

在飞镖方面也要更改代码,因为 java 现在返回整数列表

try {
      final batteryLevel = await platform.invokeListMethod('getBatteryLevel');

      setState(() {
        _batteryLevel = batteryLevel[0];
      });
于 2020-07-05T16:20:55.563 回答
0

就我而言,我只是去 android/main/MainActivity.java 并在此处粘贴官方文档的代码=此处

升级步骤 => 步骤 4。

于 2021-06-03T12:14:34.133 回答
0

更改此行

GeneratedPluginRegistrant.registerWith(new FlutterEngine(this));

进入

 GeneratedPluginRegister.registerGeneratedPlugins(FlutterEngine(this));
于 2021-06-16T06:37:30.963 回答
-1

转到 AndroidManifest.xml 文件

     <!-- Don't delete the meta-data below.
        This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
   <meta-data
       android:name="flutterEmbedding"
       android:value="2" />
于 2021-06-01T19:58:23.127 回答