---
title: "Kotlin Multiplatform SDK'da Flow Builder ile satın almaları etkinleştirme"
description: "Adapty Flow Builder ile uygulama içi satın almaları etkinleştirmek için hızlı başlangıç kılavuzu."
---

Bu kılavuz, Adapty Kotlin Multiplatform SDK v4 (beta) API'lerini kullanmaktadır. v3 kullanıyorsanız, ilgili metod adları için [geçiş kılavuzuna](migration-to-kmp-sdk-v4) bakın.

Uygulama içi satın almaları etkinleştirmek için üç temel kavramı anlamanız gerekir:

- [**Ürünler**](product) – kullanıcıların satın alabileceği her şey (abonelikler, consumable'lar, süresiz erişim)
- [**Flow'lar**](adapty-flow-builder) – no-code Flow Builder ile oluşturulan, kullanıcılara ürünleri sunan ekran dizileri. SDK bunları `getFlow` aracılığıyla getirir. Kullanıcı arayüzünü kendi kodunuzda oluşturmayı tercih ederseniz, bunun yerine bir paywall kullanın — bkz. [Paywall'ları manuel olarak uygulama](kmp-quickstart-manual).
- [**Placement'lar**](placements) – uygulamanızda flow'ları nerede ve ne zaman göstereceğiniz (`main`, `onboarding`, `settings` gibi). Flow'ları kontrol panelinde placement'lara bağlar, ardından kodunuzda placement ID'si ile talep edersiniz. Bu sayede A/B testleri çalıştırmak ve farklı kullanıcılara farklı flow'lar göstermek kolaylaşır.

Adapty, uygulamanızda satın alımları etkinleştirmek için üç yol sunar. Uygulama gereksinimlerinize göre birini seçin:

| Uygulama | Karmaşıklık | Ne zaman kullanılır |
|---|---|---|
| Adapty Flow Builder | ✅ Kolay | No-code builder'da [eksiksiz, satın almaya hazır bir flow oluşturursunuz](quickstart-paywalls). Adapty bunu otomatik olarak render eder ve tüm karmaşık satın alma akışını, makbuz doğrulamasını ve abonelik yönetimini arka planda halleder. |
| Elle oluşturulan paywalllar | 🟡 Orta | Paywall arayüzünüzü uygulama kodunuzda kendiniz uygularsınız; ancak ürün tekliflerinde esnekliği korumak için flow nesnesini yine de Adapty'den alırsınız. [Rehbere](kmp-quickstart-manual) bakın. |
| Observer modu | 🔴 Zor | Kendi satın alma altyapınız zaten mevcuttur ve bunu kullanmaya devam etmek istersiniz. Observer modunun Adapty'de bazı kısıtlamaları olduğunu unutmayın. [Makaleye](observer-vs-full-mode) bakın. |

:::important
**Aşağıdaki adımlar, Adapty Flow Builder'da oluşturulmuş bir flow'un nasıl uygulanacağını göstermektedir.**

Paywall arayüzünü kendiniz oluşturmayı tercih ediyorsanız, bkz. [Paywallları manuel olarak uygulama](kmp-quickstart-manual).
:::

Adapty Flow Builder'da oluşturulmuş bir flow'u görüntülemek için uygulama kodunuzda yalnızca şunları yapmanız gerekir:

1. **Flow'u alın**: Adapty'den alın.
2. **Görüntüleyin; satın alma işlemlerini Adapty sizin için yönetir**: Görünümü uygulamanızda gösterin.
3. **Buton eylemlerini yönetin**: Kullanıcı etkileşimlerini uygulamanızın bu etkileşimlere verdiği yanıtlarla ilişkilendirin. Örneğin, kullanıcılar butonlara tıkladığında bağlantı açın veya flow'u kapatın.

## Başlamadan önce \{#before-you-start\}

Başlamadan önce şu adımları tamamlayın:

1. Uygulamanızı Adapty Kontrol Paneli'nde [App Store](initial_ios) ve/veya [Google Play](initial-android) ile bağlayın.
2. Adapty'de [ürünlerinizi oluşturun](create-product).
3. [Bir flow oluşturun ve buna ürün ekleyin](create-paywall).
4. [Bir placement oluşturun ve flow'u buna ekleyin](create-placement).
5. Uygulama kodunuza [Adapty SDK'yı yükleyip etkinleştirin](sdk-installation-kotlin-multiplatform).

:::tip
Bu adımları tamamlamanın en hızlı yolu [hızlı başlangıç kılavuzunu](quickstart) takip etmek veya [Developer CLI](developer-cli-quickstart) kullanarak flow'lar ve placement'lar oluşturmaktır.
:::

## 1. Flow'u alın \{#1-get-the-flow\}

Flow'larınız, kontrol panelinde yapılandırılan placement'larla ilişkilidir. Placement'lar, farklı kitleler için farklı flow'lar çalıştırmanıza veya [A/B testleri](ab-tests) yapmanıza olanak tanır.

Adapty Flow Builder'da oluşturulmuş bir flow'u almak için şunları yapmanız gerekir:

1. `getFlow` metodunu kullanarak [placement](placements) ID'sine göre `flow` nesnesini alın.

2. `createFlowView` metodunu kullanarak flow view'ını oluşturun. View, flow'u görüntülemek için gereken UI öğelerini ve stilini içerir. Flow'da yapılandırılmış bir view yoksa `createFlowView` hata döndürür — bunu `onError` içinde ele alın.

:::important
Görünümü almak için Flow Builder'da **Show on device** geçişini açmanız gerekir. Aksi takdirde, `createFlowView` bir hata döndürecek ve flow görüntülenmeyecektir.
:::

```kotlin showLineNumbers
Adapty.getFlow("YOUR_PLACEMENT_ID")
    .onSuccess { flow ->
        AdaptyUI.createFlowView(flow)
            .onSuccess { view ->
                view.present()
            }
            .onError { error ->
                // the flow has no view configured, or view creation failed
            }
    }
    .onError { error ->
        // handle the error
    }
```

## 2. Flow'u görüntüleme \{#display-the-flow\}

Artık flow'a sahip olduğunuzda, onu görüntülemek için birkaç satır eklemek yeterlidir.

Görsel flow'u cihaz ekranında göstermek için önce view'ı oluşturmanız gerekir. Bunun için `AdaptyUI.createFlowView()` metodunu çağırın:

```kotlin showLineNumbers
AdaptyUI.createFlowView(flow)
    .onSuccess { view ->
        view.present()
    }
    .onError { error ->
        // handle the error
    }
```

Görünüm başarıyla oluşturulduktan sonra cihaz ekranında gösterebilirsiniz. Her görünüm yalnızca bir kez kullanılabilir: `dismiss()` çağrısından sonra flow'u tekrar göstermek için `createFlowView` fonksiyonunu tekrar çağırmanız gerekir.

:::tip
Bir flow'un nasıl görüntüleneceğine ilişkin daha fazla ayrıntı için [kılavuzumuza](kmp-present-paywalls) bakın.
:::

## 3. Buton eylemlerini yönetme \{#handle-button-actions\}

Kullanıcılar flow içindeki butonlara tıkladığında, Kotlin Multiplatform SDK satın alma işlemlerini, geri yüklemeyi, flow'u kapatmayı ve bağlantı açmayı otomatik olarak yönetir.

Ancak diğer butonların özel veya önceden tanımlanmış ID'leri vardır ve kodunuzda eylem yönetimi gerektirir. Ya da varsayılan davranışlarını geçersiz kılmak isteyebilirsiniz.

Örneğin, kapat butonu için varsayılan davranış şöyle görünür. Bunu koda eklemeniz gerekmez, ancak burada gerektiğinde nasıl yapıldığını görebilirsiniz.

Varsayılan olarak, başarılı bir satın alma işleminin ardından flow açık kalmaya devam eder. Satın alma tamamlandığında flow'u kapatmak istiyorsanız, görünümü `flowViewDidFinishPurchase` callback'inde dismiss edin.

:::tip
Buton [action](kmp-handle-paywall-actions)'larını ve [event](kmp-handling-events)'leri nasıl yöneteceğinizi anlatan kılavuzlarımızı okuyun.
:::

```kotlin showLineNumbers
AdaptyUI.setFlowsEventsObserver(object : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction -> mainUiScope.launch { view.dismiss() }
            else -> Unit
        }
    }

    override fun flowViewDidFinishPurchase(
        view: AdaptyUIFlowView,
        product: AdaptyPaywallProduct,
        purchaseResult: AdaptyPurchaseResult
    ) {
        if (purchaseResult !is AdaptyPurchaseResult.UserCanceled) {
            mainUiScope.launch { view.dismiss() }
        }
    }
})
```

## Sonraki adımlar \{#next-steps\}

Flow'unuz uygulamada görüntülenmeye hazır. Bir test satın alımını flow üzerinden tamamlayabildiğinizden emin olmak için [App Store sandbox](test-purchases-in-sandbox) ortamında veya [Google Play Store](testing-on-android) üzerinde satın alımlarınızı test edin.

Şimdi, doğru kullanıcılara flow gösterdiğinizden veya ücretli özelliklere erişim verdiğinizden emin olmak için [kullanıcıların access level'ını kontrol etmeniz](kmp-check-subscription-status) gerekiyor.

## Tam örnek \{#full-example\}

Tüm bu adımların uygulamanızda birlikte nasıl entegre edilebileceği aşağıda gösterilmektedir.

```kotlin showLineNumbers
// Set up the observer for handling flow events
AdaptyUI.setFlowsEventsObserver(object : AdaptyUIFlowsEventsObserver {
    override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
        when (action) {
            is AdaptyUIAction.CloseAction -> mainUiScope.launch { view.dismiss() }
            else -> Unit
        }
    }

    override fun flowViewDidFinishPurchase(
        view: AdaptyUIFlowView,
        product: AdaptyPaywallProduct,
        purchaseResult: AdaptyPurchaseResult
    ) {
        if (purchaseResult !is AdaptyPurchaseResult.UserCanceled) {
            mainUiScope.launch { view.dismiss() }
        }
    }
})

// Get and display the flow
Adapty.getFlow("YOUR_PLACEMENT_ID")
    .onSuccess { flow ->
        AdaptyUI.createFlowView(flow)
            .onSuccess { view ->
                view.present()
            }
            .onError { error ->
                // the flow has no view configured — use custom logic
            }
    }
    .onError { error ->
        // handle the error
    }
```