---
title: "Migrer vers le SDK Flutter Adapty v4.1"
description: "Migration vers le SDK Flutter Adapty v4.1 : activez Adapty Attribution explicitement, adoptez les API d'attribution externe renommées, re-téléchargez votre fichier de secours et gérez les achats promus sur l'App Store."
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skill. Claude Code (self-updating via plugin): `claude plugin marketplace add adaptyteam/adapty-skills && claude plugin install adapty-skills@adapty` — other tools: `npx skills add adaptyteam/adapty-skills --all`

Le SDK Flutter Adapty 4.1 modifie la façon dont Adapty Attribution est activé, renomme les API d'attribution externe et change le format du fichier de secours. Il transmet également les achats intégrés promus sur l'App Store à votre application, et ajoute un moyen de maintenir une vue de flow active après l'avoir fermée.

:::warning
Les API renommées constituent une rupture franche. Les anciens noms sont supprimés définitivement — il n'existe aucun alias déprécié pour faire la transition. Tout code compilé contre 4.0.x échouera sur 4.1 tant que vous n'aurez pas renommé chaque appel répertorié ci-dessous.
:::

Si vous êtes encore sur la version 3.x, commencez par [Migrer vers v4.0](migration-to-flutter-sdk-v4), puis suivez ce guide.

## Référence rapide \{#quick-reference\}

| v4.0 | v4.1 |
|---|---|
| Attribution Adapty activée automatiquement | Attribution Adapty désactivée par défaut ; activez-la avec `withAdaptyAttributionEnabled(true)` |
| `Adapty().updateAttribution(attribution, source: source)` | `Adapty().updateExternalAttribution(attribution, provider: provider)` |
| `AdaptyAttributionSource` | `AdaptyExternalAttributionProvider`, avec une nouvelle valeur `custom` |
| `AdaptyProfile.appliedAttributionSources` | `AdaptyProfile.appliedExternalAttributionProviders` |
| Fichier de secours téléchargé pour la v4.0 | Nouveau format de fichier de secours ; retéléchargez le fichier |
| Les achats intégrés promus se complétaient d'eux-mêmes | Votre application les complète depuis `didReceivePromotedPurchaseStream` |
| `dismissFlowView(view)` libère toujours la vue | `destroy: false` maintient la vue en vie pour la réafficher |

Les API d'achat, de profil et de présentation de flow sont par ailleurs inchangées.

## Installation \{#installation\}

Mettez à jour `adapty_flutter` vers la v4.1 dans votre `pubspec.yaml` :

```yaml showLineNumbers title="pubspec.yaml"
dependencies:
  adapty_flutter: 4.1.0
```

Si votre application utilise le [Mode enfants](kids-mode-flutter), spécifiez `adapty_flutter_kids` à la place :

```yaml showLineNumbers title="pubspec.yaml"
dependencies:
  adapty_flutter_kids: 4.1.0
```

Les prérequis sont inchangés par rapport à la v4.0 : **Flutter 3.32.0** (Dart 3.8.0) et **iOS 15.0**. Consultez [Installer le SDK Adapty](sdk-installation-flutter) pour la configuration complète.

4.1 fixe le SDK iOS natif à la version 4.1.3 et le SDK Android natif à la version 4.1.1. La version iOS corrige également les paramètres numériques des événements analytiques de flow : auparavant, chaque `0` et `1` arrivait dans `flowViewDidReceiveAnalyticEvent` sous la forme `false` et `true`.

## ⚠️ L'attribution Adapty est désactivée par défaut \{#adapty-attribution-is-disabled-by-default\}

:::warning
Si vous mettez à jour vers le SDK 4.1 sans activer explicitement l'option, l'[attribution Adapty](user-acquisition) cesse de fonctionner silencieusement — les installations ne sont plus enregistrées, et aucun avertissement ne s'affiche.
:::

Dans la version 4.0 et les versions antérieures, le SDK enregistrait les installations pour [Adapty Attribution](user-acquisition) automatiquement. À partir de la version 4.1, cette fonctionnalité est désactivée par défaut : le SDK n'enregistre pas les installations, `onUpdateInstallationDetailsSuccessStream` et `onUpdateInstallationDetailsFailStream` n'émettent jamais, et `getCurrentInstallationStatus` retourne `AdaptyInstallationStatusNotAvailable`.

Si vous utilisez Adapty Attribution, activez-le lors de la configuration du SDK :

```diff showLineNumbers
  await Adapty().activate(
-   configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY'),
+   configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
+     ..withAdaptyAttributionEnabled(true),
  );
```

Si vous n'utilisez pas l'attribution Adapty, aucune modification n'est nécessaire.

## API d'attribution externe renommées \{#renamed-external-attribution-apis\}

Les API qui transmettent les données d'attribution depuis un fournisseur externe (Adjust, AppsFlyer, Branch, Tenjin ou un fournisseur personnalisé) ont été renommées pour correspondre aux SDK natifs.

### updateAttribution → updateExternalAttribution

La méthode est renommée et son paramètre `source` est renommé en `provider`. Le paramètre accepte désormais un `AdaptyExternalAttributionProvider` au lieu d'une chaîne de caractères, et les données d'attribution restent une map :

```diff showLineNumbers
- await Adapty().updateAttribution(attribution, source: 'adjust');
+ await Adapty().updateExternalAttribution(attribution, provider: AdaptyExternalAttributionProvider.adjust);
```

### AdaptyAttributionSource → AdaptyExternalAttributionProvider

Le type de fournisseur est renommé. Il reste un wrapper ouvert sur une chaîne — les valeurs prédéfinies sont `appleAds`, `adjust`, `appsflyer`, `branch`, `tenjin`, et un nouveau `custom` pour les fournisseurs qu'Adapty n'intègre pas directement. Vous pouvez en construire un à partir de n'importe quelle autre chaîne, ce qui permet d'utiliser un fournisseur qu'Adapty ajouterait plus tard sans mettre à jour le SDK :

```dart showLineNumbers
final provider = AdaptyExternalAttributionProvider('my_provider');
```

### AdaptyProfile.appliedAttributionSources → appliedExternalAttributionProviders

La propriété du profil qui liste les fournisseurs d'attribution appliqués au profil est renommée, et le type de ses éléments change en conséquence :

```diff showLineNumbers
- if (profile.appliedAttributionSources.contains(AdaptyAttributionSource.appleAds)) {
+ if (profile.appliedExternalAttributionProviders.contains(AdaptyExternalAttributionProvider.appleAds)) {
      // Apple Ads attribution has been applied
  }
```

Le champ sérialisé du profil conserve le nom `applied_attribution_sources`, donc un backend qui lit le profil brut n'a pas besoin d'être modifié. Le code qui lit la propriété, lui, doit être mis à jour — voir [Afficher un paywall ciblé Apple Ads](flutter-show-aa-targeted-paywall).

## Fichiers de secours \{#fallback-files\}

Le format du [fichier de secours](fallback-flows) a changé dans le SDK 4.1. Téléchargez à nouveau le fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le à votre application, même si vous en aviez déjà téléchargé un pour la version 4.0.

:::warning
Cette étape ne génère aucune erreur de build. Si vous la sautez, le SDK rejette le fichier obsolète et chaque placement perd son paywall de secours.
:::

## ⚠️ Les achats intégrés promus attendent désormais votre app \{#promoted-in-app-purchases-now-wait-for-your-app\}

:::warning
Il s'agit d'un changement de comportement, pas d'une nouvelle fonctionnalité à adopter quand bon vous semble. Avec la version 4.0, un [achat intégré promu sur la page produit de l'App Store](flutter-making-purchases#promoted-in-app-purchases-from-the-app-store) se finalisait automatiquement. Avec la version 4.1, il ne se finalise que si votre app l'écoute. Livrez la version 4.1 sans le code ci-dessous et ces achats cesseront de fonctionner — l'App Store transmet le produit à votre app, et rien ne se passe ensuite.
:::

Avec la version 4.0, Adapty enregistrait un achat promu comme n'importe quelle autre transaction, sans que votre application puisse l'intercepter. La version 4.1 vous donne ce contrôle, et avec lui la responsabilité de finaliser l'achat.

Abonnez-vous à `didReceivePromotedPurchaseStream` et transmettez le produit à `makePromotedPurchase` :

```dart showLineNumbers
Adapty().didReceivePromotedPurchaseStream.listen((product) async {
  try {
    final result = await Adapty().makePromotedPurchase(product: product);
    // process the purchase result
  } on AdaptyError catch (e) {
    // handle the error
  }
});
```

Abonnez-vous avant qu'un achat promu puisse arriver — au démarrage de l'application, juste après `activate`. Le stream est un broadcast stream qui ne rejoue pas : un produit livré alors que rien n'écoute est ignoré, et l'achat est perdu.

`makePromotedPurchase` ne prend aucun paramètre d'achat, car un produit promu provient de l'App Store plutôt que d'un paywall et ne porte aucun contexte de paywall. Il retourne le même `AdaptyPurchaseResult` que `makePurchase`.

:::warning
Le stream est basé sur StoreKit 2 et nécessite **iOS 16.4** ou une version ultérieure. En dessous d'iOS 16.4, et sur Android, il n'émet jamais.
:::

Si le produit promu comporte une offre d'abonnement, le SDK l'applique automatiquement lors de l'achat. L'offre est lue depuis l'intention d'achat de l'App Store, qui l'expose sur iOS 18.0 et versions ultérieures. Sur iOS 16.4–17.x, l'achat se fait au prix de base.

## Conserver une vue de flow active après l'avoir fermée \{#keep-a-flow-view-alive-after-dismissing-it\}

`AdaptyUI().dismissFlowView` et `AdaptyUIFlowView.dismiss` acceptent un paramètre `destroy` :

```dart showLineNumbers
await AdaptyUI().dismissFlowView(view, destroy: false);
```

Par défaut, sa valeur est `true`, ce qui libère la vue comme avant. Avec `destroy: false`, la vue reste active : vous pouvez la réafficher et l'utilisateur retrouve l'écran où il s'était arrêté, avec l'état que le flow avait construit.

Une vue conservée de cette façon est maintenue en mémoire jusqu'à ce que vous la fermiez avec `destroy: true`. Présenter une vue libérée échoue, donc appelez à nouveau `createFlowView` pour afficher ce flow une nouvelle fois.

## hasViewConfiguration

`AdaptyFlow.hasViewConfiguration` exige désormais aussi que le flow contienne un schéma UI, il ne renvoie donc `true` que pour un flow qu'AdaptyUI est capable d'afficher. Un flow qui arrive dans votre application sans son schéma renvoie maintenant `false`, là où la version 4.0 renvoyait `true`. Voir [Récupérer la configuration de vue](flutter-get-pb-paywalls#fetch-the-view-configuration).