diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ddecb..2e89801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.6.0 - 2025-05-06 +- Updated to use the modern FlutterPlugin.FlutterPluginBinding pattern +- Deprecated Registrar, PluginRegistrantCallback, and ShimPluginRegistry usage +- Added backward compatibility for older Flutter versions +- Improved handling of plugin registration in background execution + ## 1.5.0 - 2025-01-29 - Updated gradle dependencies diff --git a/README.md b/README.md index 35abef4..252df3d 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,6 @@ Or add the info to the Info.plist ### Update the AppDelegate -Make sure you call the `setPluginRegistrantCallback` so other plugins can be accessed in the background. - ``` import UIKit import Flutter @@ -65,6 +63,8 @@ import background_location_tracker override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { GeneratedPluginRegistrant.register(with: self) + // Register plugins for background execution - this method is deprecated + // but kept for backward compatibility BackgroundLocationTrackerPlugin.setPluginRegistrantCallback { registry in GeneratedPluginRegistrant.register(with: registry) } @@ -124,7 +124,21 @@ Future stopLocationTracking() async { ``` This is mostly caused by a misconfiguration of the plugin: -Android Pre v2 embedding: make sure the plugin registrant callback is set -Android v2 embedding: Log a new github issues. This -iOS: make sure the plugin registrant callback is set +- Android: This plugin now uses Flutter's Plugin V2 embedding pattern (FlutterPluginBinding) so you don't need to set a manual plugin registrant callback. +- iOS: For compatibility with older Flutter versions, the setPluginRegistrantCallback is still available but will be removed in a future version. + +If you're using Flutter 1.12 or later, the plugin should work out of the box with the V2 embedding. ``` + +## Migration Guide + +### Upgrading from older versions + +This plugin has been updated to use the modern Flutter Plugin V2 embedding pattern with FlutterPluginBinding. If you're using Flutter 1.12 or later, you don't need to make any changes to your app's code. + +For backward compatibility, the older methods are still available but marked as deprecated: + +- `BackgroundLocationTrackerPlugin.setPluginRegistrantCallback` on Android +- `BackgroundLocationTrackerPlugin.setPluginRegistrantCallback` on iOS + +These methods will be removed in a future version of the plugin. diff --git a/analysis_options.yaml b/analysis_options.yaml index c995d1e..f3876a3 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -69,7 +69,7 @@ linter: - one_member_abstracts - only_throw_errors - overridden_fields - - package_api_docs + # - package_api_docs - package_names - package_prefixed_library_names - parameter_assignments diff --git a/android/src/main/kotlin/com/icapps/background_location_tracker/BackgroundLocationTrackerPlugin.kt b/android/src/main/kotlin/com/icapps/background_location_tracker/BackgroundLocationTrackerPlugin.kt index d3cffa3..0b6593a 100644 --- a/android/src/main/kotlin/com/icapps/background_location_tracker/BackgroundLocationTrackerPlugin.kt +++ b/android/src/main/kotlin/com/icapps/background_location_tracker/BackgroundLocationTrackerPlugin.kt @@ -19,17 +19,29 @@ import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result -import io.flutter.plugin.common.PluginRegistry +import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding +import io.flutter.embedding.engine.FlutterEngine class BackgroundLocationTrackerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private var lifecycle: Lifecycle? = null private var methodCallHelper: MethodCallHelper? = null - - override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { - registerBackgroundLocationManager(binding.binaryMessenger, binding.applicationContext) + private var channel: MethodChannel? = null + private var applicationContext: Context? = null + + override fun onAttachedToEngine(binding: FlutterPluginBinding) { + applicationContext = binding.applicationContext + channel = MethodChannel(binding.binaryMessenger, FOREGROUND_CHANNEL_NAME) + channel?.setMethodCallHandler(this) + + if (methodCallHelper == null) { + methodCallHelper = MethodCallHelper.getInstance(binding.applicationContext) + } } - override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + override fun onDetachedFromEngine(binding: FlutterPluginBinding) { + channel?.setMethodCallHandler(null) + channel = null + applicationContext = null } override fun onMethodCall(call: MethodCall, result: Result) { @@ -38,10 +50,7 @@ class BackgroundLocationTrackerPlugin : FlutterPlugin, MethodCallHandler, Activi override fun onAttachedToActivity(binding: ActivityPluginBinding) { lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(binding) - if (methodCallHelper == null) { - ActivityCounter.attach(binding.activity) - methodCallHelper = MethodCallHelper.getInstance(binding.activity.applicationContext) - } + ActivityCounter.attach(binding.activity) methodCallHelper?.let { lifecycle?.removeObserver(it) lifecycle?.addObserver(it) @@ -50,67 +59,42 @@ class BackgroundLocationTrackerPlugin : FlutterPlugin, MethodCallHandler, Activi override fun onDetachedFromActivity() {} - override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {} + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + onAttachedToActivity(binding) + } - override fun onDetachedFromActivityForConfigChanges() {} + override fun onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity() + } companion object { private const val TAG = "FBLTPlugin" private const val FOREGROUND_CHANNEL_NAME = "com.icapps.background_location_tracker/foreground_channel" - var pluginRegistryCallback: PluginRegistry.PluginRegistrantCallback? = null + // New static properties for background execution + private var flutterEngine: FlutterEngine? = null - @JvmStatic - private fun registerBackgroundLocationManager(messenger: BinaryMessenger, ctx: Context) { - val channel = MethodChannel(messenger, FOREGROUND_CHANNEL_NAME) - channel.setMethodCallHandler(BackgroundLocationTrackerPlugin().apply { - if (methodCallHelper == null) { - methodCallHelper = MethodCallHelper.getInstance(ctx) - } - methodCallHelper?.let { - lifecycle?.removeObserver(it) - lifecycle?.addObserver(it) - } - }) - } + // For compatibility with older plugins + @Deprecated("Use FlutterEngine's plugin registry instead") + private var pluginRegistrantCallback: ((FlutterEngine) -> Unit)? = null @JvmStatic - fun registerWith(registrar: PluginRegistry.Registrar) { - val activity = registrar.activity() - if (activity == null) { - Logger.debug(TAG, "Activity should not be null while registering this plugin") - return - } - - val lifecycle: Lifecycle = if (activity is LifecycleOwner) { - (activity as LifecycleOwner).lifecycle - } else { - Logger.debug(TAG, "Your activity has not implemented a lifecycle owner. We will create one for you.") - @Suppress("DEPRECATION") - ProxyLifecycleProvider(activity).lifecycle - } - - ActivityCounter.attach(activity) - val channel = MethodChannel(registrar.messenger(), FOREGROUND_CHANNEL_NAME) - channel.setMethodCallHandler(BackgroundLocationTrackerPlugin().apply { - if (methodCallHelper == null) { - methodCallHelper = MethodCallHelper.getInstance(registrar.activeContext()) - } - methodCallHelper?.let { - lifecycle.removeObserver(it) - lifecycle.addObserver(it) - } - }) + @Deprecated("Use the Android embedding v2 instead") + fun setPluginRegistrantCallback(callback: ((FlutterEngine) -> Unit)) { + pluginRegistrantCallback = callback } - @Deprecated(message = "Use the Android v2 embedding method.") + // Method to get or create the Flutter engine for background execution @JvmStatic - fun setPluginRegistrantCallback(pluginRegistryCallback: PluginRegistry.PluginRegistrantCallback) { - BackgroundLocationTrackerPlugin.pluginRegistryCallback = pluginRegistryCallback + fun getFlutterEngine(context: Context): FlutterEngine { + return flutterEngine ?: FlutterEngine(context).also { + flutterEngine = it + pluginRegistrantCallback?.invoke(it) + } } } - @Deprecated(message = "Use the Android v2 embedding method.") + @Deprecated("Use the Android embedding v2 instead") private class ProxyLifecycleProvider internal constructor(activity: Activity) : Application.ActivityLifecycleCallbacks, LifecycleOwner { override val lifecycle = LifecycleRegistry(this) private val registrarActivityHashCode: Int = activity.hashCode() diff --git a/android/src/main/kotlin/com/icapps/background_location_tracker/flutter/FlutterBackgroundManager.kt b/android/src/main/kotlin/com/icapps/background_location_tracker/flutter/FlutterBackgroundManager.kt index b378e4a..0f64dfa 100644 --- a/android/src/main/kotlin/com/icapps/background_location_tracker/flutter/FlutterBackgroundManager.kt +++ b/android/src/main/kotlin/com/icapps/background_location_tracker/flutter/FlutterBackgroundManager.kt @@ -11,7 +11,6 @@ import com.icapps.background_location_tracker.utils.SharedPrefsUtil import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.loader.FlutterLoader -import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation @@ -24,10 +23,7 @@ internal object FlutterBackgroundManager { private fun getInitializedFlutterEngine(ctx: Context): FlutterEngine { Logger.debug("BackgroundManager", "Creating new engine") - val engine = FlutterEngine(ctx) - //Backwards compatibility with v1. We register all the user's plugins. - BackgroundLocationTrackerPlugin.pluginRegistryCallback?.registerWith(ShimPluginRegistry(engine)) - return engine + return BackgroundLocationTrackerPlugin.getFlutterEngine(ctx) } fun sendLocation(ctx: Context, location: Location) { diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 74a78b9..40b3c14 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + // In a modern plugin using FlutterPluginBinding, plugins are automatically + // registered through the FlutterEngine's plugin registry + GeneratedPluginRegistrant.registerWith(engine) + } + } +} \ No newline at end of file diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index 3316712..6205f4d 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -9,9 +9,13 @@ import background_location_tracker didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) + + // Register plugins for background execution - this call is kept for backward compatibility + // With modern Flutter versions (1.12+), this is not required as the plugin uses FlutterPluginBinding BackgroundLocationTrackerPlugin.setPluginRegistrantCallback { registry in GeneratedPluginRegistrant.register(with: registry) } + return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } diff --git a/example/pubspec.lock b/example/pubspec.lock index 2a093dd..8a8390f 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" background_location_tracker: dependency: "direct main" description: @@ -28,34 +28,34 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" dbus: dependency: transitive description: @@ -68,10 +68,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: @@ -155,18 +155,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -187,34 +187,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.16.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.1" path_provider_linux: dependency: transitive description: @@ -363,10 +363,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.4.3" shared_preferences_windows: dependency: transitive description: @@ -384,50 +384,50 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" timezone: dependency: transitive description: @@ -456,10 +456,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" web: dependency: transitive description: @@ -485,5 +485,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.24.0" diff --git a/ios/Classes/BackgroundLocationTrackerPlugin.m b/ios/Classes/BackgroundLocationTrackerPlugin.m index bc23b12..d53c728 100644 --- a/ios/Classes/BackgroundLocationTrackerPlugin.m +++ b/ios/Classes/BackgroundLocationTrackerPlugin.m @@ -14,6 +14,8 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [SwiftBackgroundLocationTrackerPlugin registerWithRegistrar:registrar]; } +// This method is deprecated and will be removed in a future version +// Use the iOS embedding v2 method instead + (void)setPluginRegistrantCallback:(FlutterPluginRegistrantCallback)callback { [SwiftBackgroundLocationTrackerPlugin setPluginRegistrantCallback:callback]; } diff --git a/ios/Classes/ForegroundChannel.swift b/ios/Classes/ForegroundChannel.swift index 07c59da..eb2fa35 100644 --- a/ios/Classes/ForegroundChannel.swift +++ b/ios/Classes/ForegroundChannel.swift @@ -25,8 +25,15 @@ public class ForegroundChannel : NSObject { private let userDefaults = UserDefaults.standard + // This method is kept for backwards compatibility but marked as deprecated + @available(*, deprecated, message: "Use createMethodChannel(binaryMessenger:) instead") public static func getMethodChannel(with registrar: FlutterPluginRegistrar) -> FlutterMethodChannel { - return FlutterMethodChannel(name: FOREGROUND_CHANNEL_NAME, binaryMessenger: registrar.messenger()) + return createMethodChannel(binaryMessenger: registrar.messenger()) + } + + // New method that works with FlutterBinaryMessenger directly + public static func createMethodChannel(binaryMessenger: FlutterBinaryMessenger) -> FlutterMethodChannel { + return FlutterMethodChannel(name: FOREGROUND_CHANNEL_NAME, binaryMessenger: binaryMessenger) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { diff --git a/ios/Classes/SwiftBackgroundLocationTrackerPlugin.swift b/ios/Classes/SwiftBackgroundLocationTrackerPlugin.swift index 2391e5e..fb1e4da 100644 --- a/ios/Classes/SwiftBackgroundLocationTrackerPlugin.swift +++ b/ios/Classes/SwiftBackgroundLocationTrackerPlugin.swift @@ -17,7 +17,8 @@ public class SwiftBackgroundLocationTrackerPlugin: FlutterPluginAppLifeCycleDele private static var initializedBackgroundCallbacksStarted = false private static var locationData: [String: Any]? = nil - private static var flutterPluginRegistrantCallback: FlutterPluginRegistrantCallback? + // This will store the plugin that registered engines + private static var pluginRegistrants: [(FlutterEngine) -> Void] = [] private let locationManager = LocationManager.shared() @@ -27,12 +28,13 @@ extension SwiftBackgroundLocationTrackerPlugin: FlutterPlugin { @objc public static func setPluginRegistrantCallback(_ callback: @escaping FlutterPluginRegistrantCallback) { - flutterPluginRegistrantCallback = callback + // Store the callback in our new pluginRegistrants array + pluginRegistrants.append(callback) } public static func register(with registrar: FlutterPluginRegistrar) { foregroundChannel = ForegroundChannel() - let methodChannel = ForegroundChannel.getMethodChannel(with: registrar) + let methodChannel = ForegroundChannel.createMethodChannel(binaryMessenger: registrar.messenger()) let instance = SwiftBackgroundLocationTrackerPlugin() registrar.addMethodCallDelegate(instance, channel: methodChannel) registrar.addApplicationDelegate(instance) @@ -61,7 +63,10 @@ extension SwiftBackgroundLocationTrackerPlugin: FlutterPlugin { CustomLogger.log(message: "FlutterEngine.run returned `\(success)`") if success { - SwiftBackgroundLocationTrackerPlugin.flutterPluginRegistrantCallback?(flutterEngine) + // Run all the registered plugin registrants + for registrant in pluginRegistrants { + registrant(flutterEngine) + } self.flutterEngine = flutterEngine } else { CustomLogger.log(message: "FlutterEngine.run returned `false` we will cleanup the flutterEngine") diff --git a/pubspec.lock b/pubspec.lock index 319fd10..a91a1d4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,50 +5,50 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" flutter: dependency: "direct main" description: flutter @@ -63,18 +63,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -87,34 +87,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.16.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.1" sky_engine: dependency: transitive description: flutter @@ -124,50 +124,50 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" vector_math: dependency: transitive description: @@ -176,14 +176,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - web: + vm_service: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" sdks: - dart: ">=3.4.0 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54"