Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到方法错误的实现方法_Java_Android_Flutter_Dart - Fatal编程技术网

Java 未找到方法错误的实现方法

Java 未找到方法错误的实现方法,java,android,flutter,dart,Java,Android,Flutter,Dart,我有一个简单的Android应用程序。我导入了一个新的颤振模块。当我转到flatter页面时,我不能再实现本机代码了。我得到一个错误,找不到方法getBatteryLevel的实现方法。我怎样才能解决这个问题 注意:如果我运行颤振模块本身,我可以得到本机代码的结果 main.dart中的触发方法: String result = await methodChannel.invokeMethod('getBatteryLevel'); 颤振模块的主要活动: package com.derem

我有一个简单的Android应用程序。我导入了一个新的颤振模块。当我转到flatter页面时,我不能再实现本机代码了。我得到一个错误,找不到方法getBatteryLevel的实现方法。我怎样才能解决这个问题

注意:如果我运行颤振模块本身,我可以得到本机代码的结果

main.dart中的触发方法:

 String result = await methodChannel.invokeMethod('getBatteryLevel');
颤振模块的主要活动:


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更改为Flatter:

loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                        FlutterActivity.createDefaultIntent(getApplicationContext())
                );
            }
        });

您可以找到整个项目来重现错误。

请在dart代码中指定方法通道,就像在本机代码中指定通道字符串一样精确。对于这个场景,您必须在颤振端代码中编写以下代码

static const methodChannel = const MethodChannel('samples.flutter.io/battery');

 String result = await methodChannel.invokeMethod('getBatteryLevel');

请在dart代码中指定方法通道,与本机代码中的通道字符串一样精确。对于这个场景,您必须在颤振端代码中编写以下代码

static const methodChannel = const MethodChannel('samples.flutter.io/battery');

 String result = await methodChannel.invokeMethod('getBatteryLevel');

当您将颤振项目用作另一个项目中的库模块,并使用flatterActivity.createDefaultIntentgetApplicationContext导航到颤振零件时,将不会评估MainActivity。我建议您在您的本机应用程序LoginApp中创建一个新的活动,并让它扩展FlatterActivity,当您想要导航到下面的Flatter部分时启动它

// 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())
            );
        }
    });
别忘了在LoginApp的android清单中列出此活动

    <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"
        />

当您将颤振项目用作另一个项目中的库模块,并使用flatterActivity.createDefaultIntentgetApplicationContext导航到颤振零件时,将不会评估MainActivity。我建议您在您的本机应用程序LoginApp中创建一个新的活动,并让它扩展FlatterActivity,当您想要导航到下面的Flatter部分时启动它

// 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())
            );
        }
    });
别忘了在LoginApp的android清单中列出此活动

    <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"
        />


您可以在Java代码中设置断点,然后在Android Studio中启动应用程序,或者稍后附加到进程以查看是否实际调用了ConfigureFlatterEngine。您可以在Java代码中设置断点,然后在Android Studio中启动应用程序,或者稍后附加到进程以查看是否实际调用了ConfigureFlatterEngine。感谢您的支持回答但问题不仅仅是定义通道和方法名称。在将颤振模块导入Android应用程序时,我无法访问本机代码。这就是问题所在。android/folder是一个生成的文件夹。在这种情况下,您可以查看您有两个同名类的文件夹吗?由于您有名为MainActivity的颤振活动,如果您的本机活动类具有相同的命名活动,那么它可能会造成复杂性。因此,将类名改为其他名称,而不是MainActivityNo,我没有两个同名的类。您可以查看我的GitHub回购协议。请提供git回购协议,以便我可以查看我在问题中提到的关于回购协议的问题。但是@Muhannad Fakhouri已经解决了我的问题。谢谢你的关注!谢谢你的回复。但问题不仅仅是定义通道和方法名称。在将颤振模块导入Android应用程序时,我无法访问本机代码。这就是问题所在。android/folder是一个生成的文件夹。在这种情况下,您可以查看您有两个同名类的文件夹吗?由于flatter活动的名称为MainActivity,如果本机活动类的命名活动相同,则可能会造成复杂性。因此,将类名改为其他名称,而不是MainActivityNo,我没有两个同名的类。您可以查看我的GitHub回购协议。请提供git回购协议,以便我可以查看我在问题中提到的关于回购协议的问题。但是@Muhannad Fakhouri已经解决了我的问题。谢谢你的关注!非常感谢你!不客气!嘿,我有一个新问题:非常感谢!不客气!嘿,我有一个新问题: