ÿÿ Flutter ã§ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹ | Adapty ドキュメント

フローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤º - Flutter

Flow Builder ã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ルダーを使ã£ã¦ãƒ•ローやペイウォールをデザインã—ãŸå ´åˆã€ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã§ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã™ã‚‹å‡¦ç†ã‚’自分ã§å®Ÿè£…ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。フローやペイウォールã«ã¯ã€è¡¨ç¤ºã™ã‚‹å†…容ã¨è¡¨ç¤ºæ–¹æ³•ã®ä¸¡æ–¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ãƒ•ローãŠã‚ˆã³ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’対象ã¨ã—ã¦ã„ã¾ã™ã€‚リモートコンフィグã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹å ´åˆã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ•ィグã§è¨­è¨ˆã—ãŸãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

Adapty Flutter SDK ã§ã¯ã€ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹æ–¹æ³•ãŒ2ã¤ã‚りã¾ã™ã€‚

  • スタンドアロン画é¢

  • 埋ã‚è¾¼ã¿ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆ

スタンドアロン画é¢ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹

フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’スタンドアロン画é¢ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹ã«ã¯ã€createFlowView メソッドã§ä½œæˆã—㟠view ã«å¯¾ã—㦠view.present() メソッドを使用ã—ã¾ã™ã€‚å„ view ã¯ä¸€åº¦ã—ã‹è¡¨ç¤ºã§ãã¾ã›ã‚“。éžè¡¨ç¤ºã«ã™ã‚‹ã¨ã€ãã® view ã¯ãƒ¡ãƒ¢ãƒªã‹ã‚‰è§£æ”¾ã•れã¾ã™ã€‚å†åº¦ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€createFlowView ã‚’å†åº¦å‘¼ã³å‡ºã—ã¦æ–°ã—ã„ view インスタンスを作æˆã—ã¦ãã ã•ã„。

try {
  await view.present();
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

Adapty SDK ãŒãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã«ã©ã®ã‚ˆã†ã«çµ±åˆã•れã¦ã„ã‚‹ã‹ã€å®Ÿéš›ã®ä¾‹ã‚’見ã¦ã¿ã¾ã›ã‚“ã‹ï¼Ÿãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã€è³¼å…¥å‡¦ç†ã€ãã®ä»–ã®åŸºæœ¬æ©Ÿèƒ½ã‚’å«ã‚€å®Œå…¨ãªã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を実演ã—ã¦ã„るサンプルアプリをã”覧ãã ã•ã„。

フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’é–‰ã˜ã‚‹

フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’プログラムã§é–‰ã˜ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€dismiss() メソッドを使用ã—ã¾ã™ã€‚

try {
  await view.dismiss();
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

ビューを閉ã˜ã‚‹ã¨ã€ãã®ãƒ“ューã¯ãƒ¡ãƒ¢ãƒªã‹ã‚‰è§£æ”¾ã•れã¾ã™ã€‚一度閉ã˜ãŸãƒ“ューã¯å†è¡¨ç¤ºã§ãã¾ã›ã‚“。代ã‚り㫠createFlowView ã§æ–°ã—ã„ビューを作æˆã—ã¦ãã ã•ã„。

ダイアログを表示ã™ã‚‹

Android ã§ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューãŒè¡¨ç¤ºã•れã¦ã„ã‚‹ã¨ãã¯ã€ãƒã‚¤ãƒ†ã‚£ãƒ–ã®ã‚¢ãƒ©ãƒ¼ãƒˆãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®ä»£ã‚りã«ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã—ã¦ãã ã•ã„。Android ã§ã¯ã€é€šå¸¸ã®ã‚¢ãƒ©ãƒ¼ãƒˆãŒãƒ“ューã®å¾Œã‚ã«è¡¨ç¤ºã•れるãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰è¦‹ãˆãªããªã‚Šã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ラットフォームã§ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ä¸Šã«æ­£ã—ãダイアログãŒè¡¨ç¤ºã•れã¾ã™ã€‚

try {
  final action = await view.showDialog(
    title: 'Close paywall?',
    content: 'You will lose access to exclusive offers.',
    primaryActionTitle: 'Stay',
    secondaryActionTitle: 'Close',
  );
  
  if (action == AdaptyUIDialogActionType.secondary) {
    // User confirmed - close the paywall
    await view.dismiss();
  }
  // If primary - do nothing, user stays
} catch (e) {
  // handle error
}

iOSプレゼンテーションスタイルã®è¨­å®š

present() メソッド㫠iosPresentationStyle パラメータを渡ã™ã“ã¨ã§ã€iOS ã§ã®ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定ã§ãã¾ã™ã€‚ã“ã®ãƒ‘ラメータã«ã¯ AdaptyUIIOSPresentationStyle.fullScreen(デフォルト)ã¾ãŸã¯ AdaptyUIIOSPresentationStyle.pageSheet を指定ã§ãã¾ã™ã€‚

try {
  await view.present(iosPresentationStyle: AdaptyUIIOSPresentationStyle.pageSheet);
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

ウィジェット階層ã¸ã®åŸ‹ã‚è¾¼ã¿

フローやペイウォールを既存ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆãƒ„リー内ã«åŸ‹ã‚込むã«ã¯ã€AdaptyUIFlowPlatformView ウィジェットを Flutter ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆéšŽå±¤ã«ç›´æŽ¥é…ç½®ã—ã¾ã™ã€‚

AdaptyUIFlowPlatformView(
  flow: flow, // The flow object you fetched
  onDidAppear: (view) {
  },
  onDidDisappear: (view) {
  },
  onDidPerformAction: (view, action) {
  },
  onDidSelectProduct: (view, productId) {
  },
  onDidStartPurchase: (view, product) {
  },
  onDidFinishPurchase: (view, product, purchaseResult) {
  },
  onDidFailPurchase: (view, product, error) {
  },
  onDidStartRestore: (view) {
  },
  onDidFinishRestore: (view, profile) {
  },
  onDidFailRestore: (view, error) {
  },
  onDidReceiveError: (view, error) {
  },
  onDidFailLoadingProducts: (view, error) {
  },
  onDidFinishWebPaymentNavigation: (view, product, error) {
  },
)

Android ã®ãƒ—ラットフォームビューを機能ã•ã›ã‚‹ã«ã¯ã€MainActivity ㌠FlutterFragmentActivity を継承ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„:

class MainActivity : FlutterFragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

ペイウォールビルダーã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’カスタマイズã—ãŸå ´åˆã€ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰å´ã§ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã®å‡¦ç†ã‚’実装ã—ãªãã¦ã‚‚ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã§ãã¾ã™ã€‚ã“ã®ã‚ˆã†ãªãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã«ã¯ã€è¡¨ç¤ºã™ã‚‹å†…容ã¨è¡¨ç¤ºæ–¹æ³•ã®ä¸¡æ–¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ã€SDK v3.2.0 以é™ãŒå¿…è¦ãªæ–°ã—ã„ペイウォールビルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å°‚用ã§ã™ã€‚ペイウォールã®è¡¨ç¤ºæ–¹æ³•ã¯ã€ç•°ãªã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ルダーã§è¨­è¨ˆã•れãŸãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚„リモートコンフィグペイウォールã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚

Adapty Flutter SDK ã§ã¯ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºæ–¹æ³•ãŒ2ã¤ã‚りã¾ã™ï¼š

  • スタンドアロン画é¢

  • 埋ã‚è¾¼ã¿ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆ

スタンドアロン画é¢ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹

ペイウォールをスタンドアロン画é¢ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹ã«ã¯ã€createPaywallView メソッドã§ä½œæˆã—㟠view ã«å¯¾ã—㦠view.present() メソッドを呼ã³å‡ºã—ã¾ã™ã€‚å„ view ã¯ä¸€åº¦ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“。å†åº¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€createPaywallView ã‚’ã‚‚ã†ä¸€åº¦å‘¼ã³å‡ºã—ã¦æ–°ã—ã„ view インスタンスを作æˆã—ã¦ãã ã•ã„。

åŒã˜ view ã‚’å†ä½œæˆã›ãšã«å†åˆ©ç”¨ã™ã‚‹ã¨ã€AdaptyUIError.viewAlreadyPresented エラーãŒç™ºç”Ÿã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚

try {
  await view.present();
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

Adapty SDK ãŒãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã«ã©ã®ã‚ˆã†ã«çµ±åˆã•れã¦ã„ã‚‹ã‹ã€å®Ÿéš›ã®ä¾‹ã‚’見ã¦ã¿ã¾ã›ã‚“ã‹ï¼Ÿãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã€è³¼å…¥å‡¦ç†ã€ãã®ä»–ã®åŸºæœ¬æ©Ÿèƒ½ã‚’å«ã‚€å®Œå…¨ãªã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を実演ã—ã¦ã„るサンプルアプリをã”覧ãã ã•ã„。

ペイウォールを閉ã˜ã‚‹

ペイウォールをプログラムã§é–‰ã˜ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€dismiss() メソッドを使用ã—ã¦ãã ã•ã„:

try {
  await view.dismiss();
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

ダイアログを表示ã™ã‚‹

Android ã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューãŒè¡¨ç¤ºã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒã‚¤ãƒ†ã‚£ãƒ–ã®ã‚¢ãƒ©ãƒ¼ãƒˆãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®ä»£ã‚りã«ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã—ã¦ãã ã•ã„。Android ã§ã¯ã€é€šå¸¸ã®ã‚¢ãƒ©ãƒ¼ãƒˆãŒãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューã®èƒŒå¾Œã«è¡¨ç¤ºã•れるãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¦‹ãˆã¾ã›ã‚“。ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã“ã¨ã§ã€ã™ã¹ã¦ã®ãƒ—ラットフォームã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®å‰é¢ã«ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ãŒæ­£ã—ã表示ã•れã¾ã™ã€‚

try {
  final action = await view.showDialog(
    title: 'Close paywall?',
    content: 'You will lose access to exclusive offers.',
    primaryActionTitle: 'Stay',
    secondaryActionTitle: 'Close',
  );
  
  if (action == AdaptyUIDialogActionType.secondary) {
    // User confirmed - close the paywall
    await view.dismiss();
  }
  // If primary - do nothing, user stays
} catch (e) {
  // handle error
}

iOS ã®ãƒ—レゼンテーションスタイルを設定ã™ã‚‹

present() メソッド㫠iosPresentationStyle パラメーターを渡ã™ã“ã¨ã§ã€iOS ã§ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定ã§ãã¾ã™ã€‚ã“ã®ãƒ‘ラメーターã«ã¯ AdaptyUIIOSPresentationStyle.fullScreen(デフォルト)ã¾ãŸã¯ AdaptyUIIOSPresentationStyle.pageSheet を指定ã§ãã¾ã™ã€‚

try {
  await view.present(iosPresentationStyle: AdaptyUIIOSPresentationStyle.pageSheet);
} on AdaptyError catch (e) {
  // handle the error
} catch (e) {
  // handle the error
}

ウィジェット階層ã¸ã®åŸ‹ã‚è¾¼ã¿

ペイウォールを既存ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆãƒ„リーã«åŸ‹ã‚込むã«ã¯ã€AdaptyUIPaywallPlatformView ウィジェットを Flutter ã®ã‚¦ã‚£ã‚¸ã‚§ãƒƒãƒˆéšŽå±¤ã«ç›´æŽ¥é…ç½®ã—ã¾ã™ã€‚

AdaptyUIPaywallPlatformView(
  paywall: paywall, // The paywall object you fetched
  onDidAppear: (view) {
  },
  onDidDisappear: (view) {
  },
  onDidPerformAction: (view, action) {
  },
  onDidSelectProduct: (view, productId) {
  },
  onDidStartPurchase: (view, product) {
  },
  onDidFinishPurchase: (view, product, purchaseResult) {
  },
  onDidFailPurchase: (view, product, error) {
  },
  onDidStartRestore: (view) {
  },
  onDidFinishRestore: (view, profile) {
  },
  onDidFailRestore: (view, error) {
  },
  onDidFailRendering: (view, error) {
  },
  onDidFailLoadingProducts: (view, error) {
  },
  onDidFinishWebPaymentNavigation: (view, product, error) {
  },
)

Android ã®ãƒ—ラットフォームビューを機能ã•ã›ã‚‹ã«ã¯ã€MainActivity ㌠FlutterFragmentActivity を継承ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„:

class MainActivity : FlutterFragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
ÿÿÿÿ