我有一个简单的 Android 应用。我导入了一个新的颤振模块。当我传递到 Flutter 页面时,我无法再实现本机代码。我收到错误 No implementation method found for method getBatteryLevel
。我该如何解决这个问题?
注意:如果我自己运行flutter模块,可以得到native code的结果。
main.dart 中的触发方法:
String result = await methodChannel.invokeMethod('getBatteryLevel');
Flutter 模块的 MainActivity:
package com.deremakif.flutter_counter_module.host;
import io.flutter.embedding.android.FlutterActivity;
import androidx.annotation.NonNull;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.io/battery";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(((methodCall, result) -> {
if (methodCall.method.equals("getBatteryLevel")) {
result.success("batteryLevel"); // It returns string "batteryLevel".
} else {
result.notImplemented();
}
}));
}
}
登录按钮将页面从Android更改为Flutter:
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(getApplicationContext())
);
}
});
你可以找到整个项目来重现错误here。
答案 0 :(得分:2)
当您将您的 Flutter 项目用作另一个项目中的库模块,并使用 FlutterActivity.createDefaultIntent(getApplicationContext())
导航到 Flutter 部分时,您的 MainActivity 将不会被评估。我建议你在你的原生应用程序中创建一个新的 Activity(在你的例子中是 LoginApp)并让它扩展 FlutterActivity,并在你想要导航到 flutter 部分时启动它(见下文)
// in LoginApp
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
class MyFlutterActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.io/battery";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(((methodCall, result) -> {
if (methodCall.method.equals("getBatteryLevel")) {
result.success("batteryLevel"); // It returns string "batteryLevel".
} else {
result.notImplemented();
}
}));
}
}
然后像这样开始
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
new FlutterActivity.NewEngineIntentBuilder(MyFlutterActivity.class).build(getApplicationContext())
);
}
});
并且不要忘记在您的 android 清单(在 LoginApp 中)中列出此活动
<activity android:name=".ui.login.MyFlutterActivity"
android:theme="@style/AppTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
答案 1 :(得分:1)
请在您的 dart 代码中指定方法通道,与本机代码中的 CHANNEL 字符串一样准确。对于这种情况,您必须在颤振侧代码中编写以下代码
static const methodChannel = const MethodChannel('samples.flutter.io/battery');
String result = await methodChannel.invokeMethod('getBatteryLevel');