diff --git a/examples/demo-pods/analysis_options.yaml b/examples/demo-pods/analysis_options.yaml index 0d290213..0d87f43e 100644 --- a/examples/demo-pods/analysis_options.yaml +++ b/examples/demo-pods/analysis_options.yaml @@ -7,6 +7,11 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** include: package:flutter_lints/flutter.yaml linter: diff --git a/examples/demo-pods/android/app/build.gradle.kts b/examples/demo-pods/android/app/build.gradle.kts index 2ab47f29..e6d82095 100644 --- a/examples/demo-pods/android/app/build.gradle.kts +++ b/examples/demo-pods/android/app/build.gradle.kts @@ -1,6 +1,5 @@ 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") } @@ -15,10 +14,6 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.onesignal.example" @@ -39,6 +34,12 @@ android { } } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + flutter { source = "../.." } diff --git a/examples/demo-pods/android/gradle.properties b/examples/demo-pods/android/gradle.properties index 0428253d..3fda55e0 100644 --- a/examples/demo-pods/android/gradle.properties +++ b/examples/demo-pods/android/gradle.properties @@ -4,3 +4,7 @@ org.gradle.caching=true org.gradle.configureondemand=true android.useAndroidX=true android.nonTransitiveRClass=true +# This newDsl flag was added by the Flutter template +android.newDsl=false +# This builtInKotlin flag was added by the Flutter template +android.builtInKotlin=false diff --git a/examples/demo-pods/android/gradle/wrapper/gradle-wrapper.properties b/examples/demo-pods/android/gradle/wrapper/gradle-wrapper.properties index e4ef43fb..a20f2c46 100644 --- a/examples/demo-pods/android/gradle/wrapper/gradle-wrapper.properties +++ b/examples/demo-pods/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.14-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip diff --git a/examples/demo-pods/android/settings.gradle.kts b/examples/demo-pods/android/settings.gradle.kts index ca7fe065..b28021a9 100644 --- a/examples/demo-pods/android/settings.gradle.kts +++ b/examples/demo-pods/android/settings.gradle.kts @@ -19,8 +19,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.20" apply false + id("com.android.application") version "9.1.0" apply false + id("org.jetbrains.kotlin.android") version "2.4.0" apply false } include(":app") diff --git a/examples/demo/android/app/build.gradle.kts b/examples/demo/android/app/build.gradle.kts index 2ab47f29..e6d82095 100644 --- a/examples/demo/android/app/build.gradle.kts +++ b/examples/demo/android/app/build.gradle.kts @@ -1,6 +1,5 @@ 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") } @@ -15,10 +14,6 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.onesignal.example" @@ -39,6 +34,12 @@ android { } } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + flutter { source = "../.." } diff --git a/examples/demo/android/gradle/wrapper/gradle-wrapper.properties b/examples/demo/android/gradle/wrapper/gradle-wrapper.properties index e4ef43fb..a20f2c46 100644 --- a/examples/demo/android/gradle/wrapper/gradle-wrapper.properties +++ b/examples/demo/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.14-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip diff --git a/examples/demo/android/settings.gradle.kts b/examples/demo/android/settings.gradle.kts index ca7fe065..b28021a9 100644 --- a/examples/demo/android/settings.gradle.kts +++ b/examples/demo/android/settings.gradle.kts @@ -19,8 +19,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.20" apply false + id("com.android.application") version "9.1.0" apply false + id("org.jetbrains.kotlin.android") version "2.4.0" apply false } include(":app") diff --git a/examples/demo/lib/viewmodels/app_viewmodel.dart b/examples/demo/lib/viewmodels/app_viewmodel.dart index 588bef0f..86ee62d9 100644 --- a/examples/demo/lib/viewmodels/app_viewmodel.dart +++ b/examples/demo/lib/viewmodels/app_viewmodel.dart @@ -50,6 +50,12 @@ class AppViewModel extends ChangeNotifier { // user-change observer's fetch right after login). int _fetchSequence = 0; + // Last identity pair seen by the User observer. Some native SDK versions + // re-fire the observer on every user model hydration (e.g. after addEmail + // or addTag), so only refetch when the identity actually changes. + String? _observedOnesignalId; + String? _observedExternalId; + // App state String _appId = ''; String get appId => _appId; @@ -149,6 +155,8 @@ class AppViewModel extends ChangeNotifier { final onesignalId = await OneSignal.User.getOnesignalId(); _oneSignalId = onesignalId; + _observedOnesignalId ??= onesignalId; + _observedExternalId ??= await OneSignal.User.getExternalId(); notifyListeners(); @@ -191,9 +199,18 @@ class AppViewModel extends ChangeNotifier { 'externalId=${state.current.externalId ?? 'null'}', ); + final nextExternalId = state.current.externalId; + final identityChanged = + nextOnesignalId != _observedOnesignalId || + nextExternalId != _observedExternalId; + _observedOnesignalId = nextOnesignalId; + _observedExternalId = nextExternalId; + _oneSignalId = nextOnesignalId; notifyListeners(); + if (!identityChanged) return; + // Drive the post-login fetch from the observer so it runs only once the // SDK has actually assigned a new onesignalId. Logout clears it to null; // skip the fetch in that case (logoutUser already clears local lists).