From 6223222530038a0cca0fb30f4f1c8229efb5a3c4 Mon Sep 17 00:00:00 2001 From: Daniel Jimenez <122808735+daniJimen@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:26:09 +0100 Subject: [PATCH 1/5] * update dependencies android & flutter --- example/android/app/build.gradle | 60 ++-- .../android/app/src/main/AndroidManifest.xml | 22 +- example/android/build.gradle | 25 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- example/android/settings.gradle | 30 +- example/lib/dio.dart | 2 +- example/pubspec.lock | 275 ++++++++++++++---- example/pubspec.yaml | 6 +- lib/src/error_material_alert.dart | 27 +- lib/src/native_updater.dart | 10 +- lib/src/update_cupertino_alert.dart | 13 +- pubspec.lock | 256 ++++++++++++---- pubspec.yaml | 18 +- 13 files changed, 504 insertions(+), 244 deletions(-) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 842116b..3561de2 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -1,54 +1,36 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 28 + namespace "com.example.package_tester" + compileSdk 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' } - lintOptions { - disable 'InvalidPackage' - } - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.package_tester" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + minSdkVersion flutter.minSdkVersion + targetSdk 34 + versionCode 1 + versionName "1.0" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' } buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug } } @@ -57,7 +39,3 @@ android { flutter { source '../..' } - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index e691e8c..9395cf5 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,45 +1,25 @@ - - - - - diff --git a/example/android/build.gradle b/example/android/build.gradle index 3100ad2..bf1c7f7 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,31 +1,18 @@ -buildscript { - ext.kotlin_version = '1.3.50' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() - jcenter() + mavenCentral() } } -rootProject.buildDir = '../build' +rootProject.layout.buildDirectory.set(file("../build")) subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" + project.layout.buildDirectory.set(rootProject.layout.buildDirectory.dir(project.name)) } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } -task clean(type: Delete) { - delete rootProject.buildDir +tasks.register("clean", Delete) { + delete rootProject.layout.buildDirectory } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 296b146..d492857 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Wed Jan 28 14:34:10 CET 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 5a2f14f..93992f6 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -1,15 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory +plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + id "com.android.application" version "8.9.0" apply false + id "org.jetbrains.kotlin.android" version "2.1.0" apply false } + +include ":app" diff --git a/example/lib/dio.dart b/example/lib/dio.dart index 3dbe947..536504d 100644 --- a/example/lib/dio.dart +++ b/example/lib/dio.dart @@ -63,7 +63,7 @@ class _HomeState extends State { try { Response response = await dio.get('/get'); } on DioError catch (e) { - checkVersion(e.response.statusCode); + checkVersion(e.response!.statusCode!); } } } diff --git a/example/pubspec.lock b/example/pubspec.lock index ca220b7..e749811 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,70 +5,103 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "5bbf32bc9e518d41ec49718e2931cd4527292c9b0c6d2dffcf7fe6b9a8a8cf72" + url: "https://pub.dev" source: hosted version: "2.1.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.4.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.19.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: "486b7bc707424572cdf7bd7e812a0c146de3fd47ecadf070254cc60383f21dd8" + url: "https://pub.dev" source: hosted version: "1.0.3" dio: dependency: "direct main" description: name: dio - url: "https://pub.dartlang.org" + sha256: b9d46faecab38fc8cc286f80bc4d61a3bb5d4ac49e51ed877b4d6706efe57b25 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.9.1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c + url: "https://pub.dev" + source: hosted + version: "2.1.5" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" flutter_test: dependency: "direct dev" description: flutter @@ -79,172 +112,290 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + url: "https://pub.dev" source: hosted version: "4.0.0" in_app_update: dependency: transitive description: name: in_app_update - url: "https://pub.dartlang.org" + sha256: "9924a3efe592e1c0ec89dda3683b3cfec3d4cd02d908e6de00c24b759038ddb1" + url: "https://pub.dev" source: hosted - version: "2.0.0" - js: + version: "4.2.5" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: dependency: transitive description: - name: js - url: "https://pub.dartlang.org" + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" source: hosted - version: "0.12.10" + version: "0.11.1" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" native_updater: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.1.0" - package_info: + version: "1.0.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: dependency: transitive description: - name: package_info - url: "https://pub.dartlang.org" + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.2.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.8" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: d5f89a9e52b36240a80282b3dc0667dd36e53459717bb17b8fb102d30496606a + url: "https://pub.dev" source: hosted version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: dd11571b8a03f7cadcf91ec26a77e02bfbd6bbba2a512924d3116646b4198fc4 + url: "https://pub.dev" source: hosted version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a88162591b02c1f3a3db3af8ce1ea2b374bd75a7bb8d5e353bcfbdc79d719830 + url: "https://pub.dev" source: hosted version: "1.2.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.7.7" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + url: "https://pub.dev" source: hosted version: "1.3.0" url_launcher: dependency: transitive description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.dev" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" source: hosted - version: "6.0.6" + version: "6.3.6" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.4.2" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.1.5" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" sdks: - dart: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=3.10.0 <4.0.0" + flutter: ">=3.38.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 4c554ee..26ba855 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,22 +1,24 @@ name: example description: A new Flutter project. +publish_to: 'none' version: 1.0.0+1 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: '>=3.0.0 <4.0.0' dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.3 - dio: ^4.0.0 + dio: ^5.0.0 native_updater: path: ../ dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^3.0.0 flutter: uses-material-design: true diff --git a/lib/src/error_material_alert.dart b/lib/src/error_material_alert.dart index ff4cdb7..2d12a9f 100644 --- a/lib/src/error_material_alert.dart +++ b/lib/src/error_material_alert.dart @@ -6,7 +6,8 @@ class ErrorMaterialAlert extends StatelessWidget { final String? errorCloseButtonLabel; final String? errorSubtitle; - ErrorMaterialAlert({ + const ErrorMaterialAlert({ + super.key, required this.appName, required this.description, this.errorCloseButtonLabel, @@ -17,12 +18,13 @@ class ErrorMaterialAlert extends StatelessWidget { Widget build(BuildContext context) { final ButtonStyle flatButtonStyle = TextButton.styleFrom( backgroundColor: Colors.green, + foregroundColor: Colors.white, ); Widget closeButton = TextButton( - child: Text(errorCloseButtonLabel ?? 'CLOSE', style: TextStyle(color: Colors.white)), - onPressed: () => Navigator.pop(context), style: flatButtonStyle, + onPressed: () => Navigator.pop(context), + child: Text(errorCloseButtonLabel ?? 'CLOSE'), ); return AlertDialog( @@ -31,22 +33,23 @@ class ErrorMaterialAlert extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - errorSubtitle ?? 'Can\'t perform update.', - style: TextStyle(color: Colors.grey), - ), - SizedBox(height: 24.0), + if (errorSubtitle != null || errorSubtitle == null) + Text( + errorSubtitle ?? 'Can\'t perform update.', + style: const TextStyle(color: Colors.grey), + ), + const SizedBox(height: 24.0), Text(description), - SizedBox(height: 24.0), + const SizedBox(height: 24.0), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ closeButton, ], ), - SizedBox(height: 16.0), - Divider(), - SizedBox(height: 16.0), + const SizedBox(height: 16.0), + const Divider(), + const SizedBox(height: 16.0), Image.asset( 'packages/native_updater/images/google_play.png', width: 120.0, diff --git a/lib/src/native_updater.dart b/lib/src/native_updater.dart index b7be4bd..2dec053 100644 --- a/lib/src/native_updater.dart +++ b/lib/src/native_updater.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:in_app_update/in_app_update.dart'; -import 'package:package_info/package_info.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'error_material_alert.dart'; import 'update_cupertino_alert.dart'; @@ -87,7 +87,7 @@ class NativeUpdater { Widget alert = UpdateCupertinoAlert( forceUpdate: _forceUpdate, appName: _appName, - appStoreUrl: _appStoreUrl!, + appStoreUrl: _appStoreUrl ?? '', description: _iOSDescription ?? selectedDefaultDescription, updateButtonLabel: _iOSUpdateButtonLabel ?? 'Update', closeButtonLabel: _iOSCloseButtonLabel ?? 'Close App', @@ -97,7 +97,7 @@ class NativeUpdater { showDialog( context: _context, - barrierDismissible: _forceUpdate ? false : true, + barrierDismissible: !_forceUpdate, builder: (BuildContext context) { return alert; }, @@ -107,9 +107,9 @@ class NativeUpdater { void _showMaterialAlertDialog() async { /// In App Update Related try { - AppUpdateInfo _updateInfo = await InAppUpdate.checkForUpdate(); + AppUpdateInfo updateInfo = await InAppUpdate.checkForUpdate(); - if (_updateInfo.updateAvailability == UpdateAvailability.updateAvailable) { + if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) { if (_forceUpdate == true) { InAppUpdate.performImmediateUpdate() .catchError((e) => developer.log(e.toString())); diff --git a/lib/src/update_cupertino_alert.dart b/lib/src/update_cupertino_alert.dart index 25f5b49..ad5e7b4 100644 --- a/lib/src/update_cupertino_alert.dart +++ b/lib/src/update_cupertino_alert.dart @@ -14,7 +14,8 @@ class UpdateCupertinoAlert extends StatelessWidget { final String ignoreButtonLabel; final String alertTitle; - UpdateCupertinoAlert({ + const UpdateCupertinoAlert({ + super.key, required this.forceUpdate, required this.appName, required this.appStoreUrl, @@ -39,14 +40,20 @@ class UpdateCupertinoAlert extends StatelessWidget { ); Widget updateButton = CupertinoDialogAction( + isDefaultAction: true, child: Text(updateButtonLabel), - onPressed: () => launch(appStoreUrl), + onPressed: () async { + final Uri url = Uri.parse(appStoreUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url, mode: LaunchMode.externalApplication); + } + }, ); return CupertinoAlertDialog( title: Text(alertTitle), content: Padding( - padding: EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only(top: 8.0), child: Text(description), ), actions: [ diff --git a/pubspec.lock b/pubspec.lock index 1d6f95d..1aeab9a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,56 +5,79 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "5bbf32bc9e518d41ec49718e2931cd4527292c9b0c6d2dffcf7fe6b9a8a8cf72" + url: "https://pub.dev" source: hosted version: "2.1.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.4.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: "8e36feea6de5ea69f2199f29cf42a450a855738c498b57c0b980e2d3cca9c362" + url: "https://pub.dev" source: hosted version: "1.2.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.19.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c + url: "https://pub.dev" + source: hosted + version: "2.1.5" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" flutter_test: dependency: "direct dev" description: flutter @@ -65,158 +88,275 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" in_app_update: dependency: "direct main" description: name: in_app_update - url: "https://pub.dartlang.org" + sha256: "9924a3efe592e1c0ec89dda3683b3cfec3d4cd02d908e6de00c24b759038ddb1" + url: "https://pub.dev" + source: hosted + version: "4.2.5" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" source: hosted - version: "2.0.0" - js: + version: "3.0.2" + lints: dependency: transitive description: - name: js - url: "https://pub.dartlang.org" + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "3.0.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" source: hosted - version: "0.12.10" + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" source: hosted - version: "1.3.0" - package_info: + version: "1.17.0" + package_info_plus: dependency: "direct main" description: - name: package_info - url: "https://pub.dartlang.org" + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.2.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.8" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: d5f89a9e52b36240a80282b3dc0667dd36e53459717bb17b8fb102d30496606a + url: "https://pub.dev" source: hosted version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: dd11571b8a03f7cadcf91ec26a77e02bfbd6bbba2a512924d3116646b4198fc4 + url: "https://pub.dev" source: hosted version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a88162591b02c1f3a3db3af8ce1ea2b374bd75a7bb8d5e353bcfbdc79d719830 + url: "https://pub.dev" source: hosted version: "1.2.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.7.7" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.dev" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" source: hosted - version: "6.0.10" + version: "6.3.6" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.4.2" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.1.5" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" sdks: - dart: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=3.10.0 <4.0.0" + flutter: ">=3.38.0" diff --git a/pubspec.yaml b/pubspec.yaml index d7e0853..7f9a75e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,26 +1,28 @@ name: native_updater description: Flutter package for prompting users to update with a native dialog whether using the app store version or any version at the user's discretion. -author: Ofload -version: 0.1.1 -homepage: https://github.com/ofload/native_updater +version: 1.0.0 +repository: https://github.com/ofload/native_updater +issue_tracker: https://github.com/ofload/native_updater/issues environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=3.0.0 <4.0.0' + flutter: '>=3.10.0' dependencies: flutter: sdk: flutter - # package_info will help us to find current installed version of application. - package_info: ^2.0.2 + # package_info_plus will help us to find current installed version of application. + package_info_plus: ^8.0.0 # url_launcher will help us to trigger app store / play store url from our app. - url_launcher: ^6.0.10 + url_launcher: ^6.3.0 # Enables In App Updates on Android using the official Android APIs. - in_app_update: ^2.0.0 + in_app_update: ^4.0.0 dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^3.0.0 flutter: assets: From 3805239ff908891b7d92173a7859dc19ad48fcbe Mon Sep 17 00:00:00 2001 From: Daniel Jimenez <122808735+daniJimen@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:45:22 +0100 Subject: [PATCH 2/5] Updates Android build configuration and dependencies in example app - Updates Java and JVM target version from 1.8 to 11. - Switches the Kotlin plugin ID to the fully qualified `org.jetbrains.kotlin.android`. - Adjusts Gradle distribution to version 8.10.2-all. - Increases Gradle heap memory and metaspace limits. - Disables `android.enableJetifier`. - Downgrades `com.android.application` and `org.jetbrains.kotlin.android` plugin versions for better compatibility. --- example/android/app/build.gradle | 8 ++++---- example/android/gradle.properties | 6 +++--- example/android/gradle/wrapper/gradle-wrapper.properties | 3 +-- example/android/settings.gradle | 6 +++--- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 3561de2..25516d7 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -1,6 +1,6 @@ plugins { id "com.android.application" - id "kotlin-android" + id "org.jetbrains.kotlin.android" id "dev.flutter.flutter-gradle-plugin" } @@ -21,12 +21,12 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '11' } buildTypes { diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 38c8d45..f71311d 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=512m android.useAndroidX=true -android.enableJetifier=true +android.enableJetifier=false +android.enableR8=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index d492857..afa1e8e 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Jan 28 14:34:10 CET 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 93992f6..3befa54 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -17,9 +17,9 @@ pluginManagement { } plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - id "com.android.application" version "8.9.0" apply false - id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "dev.flutter.flutter-gradle-plugin" apply false + id "com.android.application" version "8.3.2" apply false + id "org.jetbrains.kotlin.android" version "1.9.22" apply false } include ":app" From 26234e52bce1f7fbf648f8ae6bf57602ed7a08c9 Mon Sep 17 00:00:00 2001 From: Daniel Jimenez <122808735+daniJimen@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:45:29 +0100 Subject: [PATCH 3/5] Migrates Android example to Gradle Kotlin DSL and updates dependencies Converts the Android build configuration from Groovy (`.gradle`) to Kotlin DSL (`.gradle.kts`) for the app-level `build.gradle`, project-level `build.gradle`, and `settings.gradle` files. Key changes include: - Updates Gradle wrapper to version 9.1.0. - Updates Android Gradle Plugin to 8.13.1 and Kotlin to 2.2.21. - Refactors `build.gradle.kts` to use `flutter` extension properties for SDK versions (compileSdk, minSdk, targetSdk). - Modernizes `settings.gradle.kts` to use the `dev.flutter.flutter-plugin-loader`. - Adjusts JVM arguments in `gradle.properties` for better memory management. - Cleans up `AndroidManifest.xml` by removing the redundant `package` attribute. - Simplifies `MainActivity.kt` syntax. --- example/android/app/build.gradle | 41 ------------------ example/android/app/build.gradle.kts | 43 +++++++++++++++++++ .../android/app/src/main/AndroidManifest.xml | 3 +- .../example/package_tester/MainActivity.kt | 3 +- example/android/build.gradle | 18 -------- example/android/build.gradle.kts | 21 +++++++++ example/android/gradle.properties | 6 +-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/android/settings.gradle | 25 ----------- example/android/settings.gradle.kts | 25 +++++++++++ 10 files changed, 95 insertions(+), 92 deletions(-) delete mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/build.gradle.kts delete mode 100644 example/android/build.gradle create mode 100644 example/android/build.gradle.kts delete mode 100644 example/android/settings.gradle create mode 100644 example/android/settings.gradle.kts diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle deleted file mode 100644 index 25516d7..0000000 --- a/example/android/app/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id "com.android.application" - id "org.jetbrains.kotlin.android" - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace "com.example.package_tester" - compileSdk 34 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - applicationId "com.example.package_tester" - minSdkVersion flutter.minSdkVersion - targetSdk 34 - versionCode 1 - versionName "1.0" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = '11' - } - - buildTypes { - release { - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} diff --git a/example/android/app/build.gradle.kts b/example/android/app/build.gradle.kts new file mode 100644 index 0000000..274c4bc --- /dev/null +++ b/example/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.package_tester" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + applicationId = "com.example.package_tester" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 9395cf5..70a3399 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/example/android/app/src/main/kotlin/com/example/package_tester/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/package_tester/MainActivity.kt index ea41cc5..df93289 100644 --- a/example/android/app/src/main/kotlin/com/example/package_tester/MainActivity.kt +++ b/example/android/app/src/main/kotlin/com/example/package_tester/MainActivity.kt @@ -2,5 +2,4 @@ package com.example.package_tester import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() { -} +class MainActivity: FlutterActivity() diff --git a/example/android/build.gradle b/example/android/build.gradle deleted file mode 100644 index bf1c7f7..0000000 --- a/example/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.layout.buildDirectory.set(file("../build")) -subprojects { - project.layout.buildDirectory.set(rootProject.layout.buildDirectory.dir(project.name)) -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.layout.buildDirectory -} diff --git a/example/android/build.gradle.kts b/example/android/build.gradle.kts new file mode 100644 index 0000000..89176ef --- /dev/null +++ b/example/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/example/android/gradle.properties b/example/android/gradle.properties index f71311d..d21ab09 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=512m +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true -android.enableJetifier=false -android.enableR8=true +android.enableJetifier=true + diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index afa1e8e..2d428bf 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle deleted file mode 100644 index 3befa54..0000000 --- a/example/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-gradle-plugin" apply false - id "com.android.application" version "8.3.2" apply false - id "org.jetbrains.kotlin.android" version "1.9.22" apply false -} - -include ":app" diff --git a/example/android/settings.gradle.kts b/example/android/settings.gradle.kts new file mode 100644 index 0000000..8477e0f --- /dev/null +++ b/example/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.13.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.21" apply false +} + +include(":app") From b6ab0213142e3f6ea6fc1c179781d1398924184b Mon Sep 17 00:00:00 2001 From: Daniel Jimenez <122808735+daniJimen@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:22:30 +0100 Subject: [PATCH 4/5] Improves error handling in Dio example Updates the Dio example to safely access the status code from the error response. It now checks for nullability before passing the status code to the version check function, preventing potential null pointer exceptions during error handling. --- example/lib/dio.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/example/lib/dio.dart b/example/lib/dio.dart index 536504d..cc86617 100644 --- a/example/lib/dio.dart +++ b/example/lib/dio.dart @@ -61,9 +61,12 @@ class _HomeState extends State { )); try { - Response response = await dio.get('/get'); + await dio.get('/get'); } on DioError catch (e) { - checkVersion(e.response!.statusCode!); + var code = e.response?.statusCode; + if(code != null){ + checkVersion(code); + } } } } From 1487085b4622123b4fbd23f3f8d8fd789870b768 Mon Sep 17 00:00:00 2001 From: Daniel Jimenez <122808735+daniJimen@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:07:33 +0100 Subject: [PATCH 5/5] Updates `displayUpdateAlert` to return a Future and modernizes project configuration Refactors `NativeUpdater.displayUpdateAlert` to return `Future` and updates the example app to correctly await these calls within async blocks. Key changes based on the changelog and diffs: - Updates the library to Flutter 3.x and Dart 3.x. - Migrates from `package_info` to `package_info_plus`. - Updates `url_launcher` and `in_app_update` to their latest versions. - Modernizes the Android build system using the declarative Gradle plugin system. - Increases Android `compileSdk` and `targetSdk` to 35. - Upgrades Android environment to Java 17 and Kotlin 2.1.0. - Implements code quality improvements including `const` constructors and updated Flutter best practices. - Fixes build errors related to unresolved references in Android migration. --- CHANGELOG.md | 11 +++++++++++ example/lib/dio.dart | 4 ++-- example/lib/main.dart | 6 +++--- lib/src/native_updater.dart | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 125e93f..876acd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [1.0.0] - 28/01/2026 + +- Updated to Flutter 3.x and Dart 3.x. +- Migrated from `package_info` to `package_info_plus`. +- Updated `url_launcher` and `in_app_update` to latest versions. +- Migrated Android build system to the new declarative Gradle plugin system. +- Updated Android compileSdk and targetSdk to 35. +- Migrated Android to Java 17 and Kotlin 2.1.0. +- Improved code quality with `const` constructors and modern Flutter best practices. +- Fixed `Unresolved reference: io` and other migration-related build errors. + ## [0.1.1] - 19/12/2021 - Keeping dependencies up-to-date diff --git a/example/lib/dio.dart b/example/lib/dio.dart index cc86617..ecdcde1 100644 --- a/example/lib/dio.dart +++ b/example/lib/dio.dart @@ -26,9 +26,9 @@ class _HomeState extends State { /// For example: You got status code of 412 from the /// response of HTTP request. /// Let's say the statusCode 412 requires you to force update - Future.delayed(Duration.zero, () { + Future.delayed(Duration.zero, () async { if (statusCode == HttpStatus.unauthorized) { - NativeUpdater.displayUpdateAlert( + await NativeUpdater.displayUpdateAlert( context, forceUpdate: true, appStoreUrl: '', diff --git a/example/lib/main.dart b/example/lib/main.dart index 2b44ad5..78acbb6 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -37,9 +37,9 @@ class _HomeState extends State { /// This could get from the API int serverLatestVersion = 10; - Future.delayed(Duration.zero, () { + Future.delayed(Duration.zero, () async { if (statusCode == 412) { - NativeUpdater.displayUpdateAlert( + await NativeUpdater.displayUpdateAlert( context, forceUpdate: true, appStoreUrl: '', @@ -51,7 +51,7 @@ class _HomeState extends State { errorSubtitle: "This version of the app isn't legit" ); } else if (serverLatestVersion > localVersion) { - NativeUpdater.displayUpdateAlert( + await NativeUpdater.displayUpdateAlert( context, forceUpdate: false, appStoreUrl: '', diff --git a/lib/src/native_updater.dart b/lib/src/native_updater.dart index 2dec053..8386e43 100644 --- a/lib/src/native_updater.dart +++ b/lib/src/native_updater.dart @@ -31,7 +31,7 @@ class NativeUpdater { NativeUpdater._internal(); /// Displaying update alert - static displayUpdateAlert( + static Future displayUpdateAlert( BuildContext context, { required bool forceUpdate, String? appStoreUrl,