Я реализую MethodChannel для передачи значения со стороны Flutter в собственный код Kotlin Android. Я следовал этим двум урокам, и они делают то же самое, что и я:
Моя реализация MethodChannel в main.dart [Flutter] выглядит следующим образом:
class _MyHomePageState extends State<MyHomePage> {
static const frequencyChannel =
MethodChannel('com.somdipdey.eoptomizer/frequency');
...
...
Future setFrequencyLevelCPU0Max() async {
var sendMapMaxCPUFreq = <String, String>{
"LITTLECPUMaxFreq": _LITTLECPUFreq.text.toString()
};
final String frequencyLevelCPU0Max = await frequencyChannel.invokeMethod(
'setFrequencyLevelCPU0Max', sendMapMaxCPUFreq);
}
}
На стороне Kotlin в MainActivity.kt код реализации MethodChannel выглядит следующим образом:
class MainActivity: FlutterActivity() {
private val OPTIMIZATION_CHANNEL = "com.somdipdey.eoptomizer/frequency"
private lateinit var channel: MethodChannel
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, OPTIMIZATION_CHANNEL)
channel.setMethodCallHandler { call, result ->
if (call.method == "setFrequencyLevelCPU0Max" || call.method == "setFrequencyLevelCPU0Min" || call.method == "setFrequencyLevelCPU4Min") {
var arguments = call.arguments() as Map<String,String>
var LITTLECPUMaxFreq = arguments["LITTLECPUMaxFreq"].toString() ?: "1766400"
setFrequencyLevelCPU0Max(LITTLECPUMaxFreq)
result.success("Optimizing frequencies on CPU0")
}
}
}
}
Когда я пытаюсь собрать/запустить проект, я получаю следующую ошибку на стороне Kotlin:
MainActivity.kt: (27, 38): несоответствие типов: предполагаемый тип — Map<String, Строка>? но ожидалось Map<String, String>
Эта ошибка возникает для следующей строки кода:
var arguments = call.arguments() as Map<String,String>
Как я могу решить эту проблему?
Компилятор Kotlin не может предположить, что call.arguments() возвращает ненулевое значение, поэтому правильный тип — Map<String,String>?, что означает, что вы должны привести его к этому. Следующую строку также необходимо изменить, чтобы иметь дело с потенциально нулевым значением аргумента:
var arguments = call.arguments() as Map<String,String>?
var LITTLECPUMaxFreq = arguments?.get("LITTLECPUMaxFreq")?.toString() ?: "1766400"
Спасибо, приятель. Я застрял с этой проблемой с полудня. Очень ценю помощь! :)