diff --git a/README.md b/README.md index ed4ed365..43f4cc31 100644 --- a/README.md +++ b/README.md @@ -273,6 +273,7 @@ void initState() { @override void dispose() { + FlutterDownloader.registerCallback(null); IsolateNameServer.removePortNameMapping('downloader_send_port'); super.dispose(); } @@ -284,6 +285,7 @@ static void downloadCallback(String id, DownloadTaskStatus status, int progress) ```` +- Note: set `callback` as `null` to remove listener. You should clean up callback to prevent from leaking references. #### Load all tasks: diff --git a/example/lib/main.dart b/example/lib/main.dart index d6b32106..a8cc011d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -129,6 +129,7 @@ class _MyHomePageState extends State { @override void dispose() { + FlutterDownloader.registerCallback(null); _unbindBackgroundIsolate(); super.dispose(); } diff --git a/lib/src/downloader.dart b/lib/src/downloader.dart index 48913909..446a3816 100644 --- a/lib/src/downloader.dart +++ b/lib/src/downloader.dart @@ -383,13 +383,28 @@ class FlutterDownloader { /// /// {@end-tool} /// - static registerCallback(DownloadCallback callback) { + static registerCallback(DownloadCallback? callback) { assert(_initialized, 'FlutterDownloader.initialize() must be called first'); - final callbackHandle = PluginUtilities.getCallbackHandle(callback)!; - assert(callbackHandle != null, - 'callback must be a top-level or a static function'); - _channel.invokeMethod( - 'registerCallback', [callbackHandle.toRawHandle()]); + if (callback != null) { + // remove previous setting + _channel.setMethodCallHandler(null); + _channel.setMethodCallHandler((MethodCall call) async { + if (call.method == 'updateProgress') { + String id = call.arguments['task_id']; + int status = call.arguments['status']; + int process = call.arguments['progress']; + callback(id, DownloadTaskStatus(status), process); + } + }); + + final callbackHandle = PluginUtilities.getCallbackHandle(callback)!; + assert(callbackHandle != null, + 'callback must be a top-level or a static function'); + _channel.invokeMethod( + 'registerCallback', [callbackHandle.toRawHandle()]); + } else { + _channel.setMethodCallHandler(null); + } } }