I was trying to integrate a basic network scanner using python into flutter. The scanner function returns a List in the format List[List, Int]. To call this I use MainActivity.kt like this
package com.example.ctos
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import com.chaquo.python.Python
import com.chaquo.python.android.AndroidPlatform
class MainActivity: FlutterActivity() {
private val CHANNEL = "python"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// Initialize Python
if (!Python.isStarted()) {
Python.start(AndroidPlatform(this))
}
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
when (call.method) {
"startScan" -> {
val hosts = call.argument<String>("hosts")
val ports = call.argument<String>("ports")
val scanType = call.argument<String>("scanType")
val py = Python.getInstance()
val results = py.getModule("network_scanner")
.callAttr("startScan", hosts, ports, scanType)
result.success(results)
}
else -> result.notImplemented()
}
}
}
}
And a python bridge to call the script
import 'package:flutter/services.dart';
class PythonBridge {
static const MethodChannel _channel = MethodChannel('python');
static Future<List> scanPort(
String hosts, String ports, String scanType) async {
return await _channel.invokeMethod(
'startScan', {'hosts': hosts, 'ports': ports, "ScanType": scanType});
}
}
and in the dart fileusing a try catch I am calling it like this
var results = await _channel.invokeMethod('startScan', {
'hosts': '192.168.84.229',
'ports': '8999-9001',
'scanType': 'tcp_scan'
});
print(results);
The python script have print statements to make sure its working and whenever the function is called through dart I can see the output is getting printed after all scan is done. Scans are done through threads for parallel processing.
with ThreadPoolExecutor(max_workers=max_threads) as executor:
future_to_target = {
executor.submit(tcp_single_scan, host, port, timeout): (host, port) for host, port in scan_targets
}
for future in as_completed(future_to_target):
result = future.result()
results.append(result)
completed+=1
progress = (completed / total) * 100
if(int(progress) != int_progress):
print(str(int(progress))+"%")
int_progress = int(progress)
But after all scan done I am getting stack overflow error and app gets exit.

Is this something related to threads. I even tried with just scanning one port and still causing issue.