ÿÿ オンボーディング | Flutter SDK | Adapty ドキュメント

Flutter SDKã§ã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ã™ã‚‹

オンボーディングã¯SDK v4ã§éžæŽ¨å¥¨ã¨ãªã‚Šã€å°†æ¥ã®ãƒªãƒªãƒ¼ã‚¹ã§å‰Šé™¤ã•れる予定ã§ã™ã€‚ ãƒã‚°ä¿®æ­£ã‚„機能改善ã¯è¡Œã‚れã¾ã›ã‚“。代ã‚りã«ãƒ•ローをã”利用ãã ã•ã„。オンボーディングãŒWebView内ã§å‹•作ã™ã‚‹ã®ã«å¯¾ã—ã€ãƒ•ローã¯ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ãƒã‚¤ãƒ†ã‚£ãƒ–ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•れるãŸã‚ã€ã‚ˆã‚Šã‚¹ãƒ ãƒ¼ã‚ºãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã€ä¸€è²«ã—ãŸãƒã‚¤ãƒ†ã‚£ãƒ–ã®å¤–観ã€é«˜é€Ÿãªèª­ã¿è¾¼ã¿ã€WebViewランタイムã¸ã®ä¾å­˜ãŒãªã„ã¨ã„ã£ãŸãƒ¡ãƒªãƒƒãƒˆãŒã‚りã¾ã™ã€‚ã¾ãšã¯ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®å–å¾—ãŠã‚ˆã³ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚’ã”覧ãã ã•ã„。

ユーザーãŒã‚¯ã‚¤ã‚ºã®è³ªå•ã«å›žç­”ã—ãŸã‚Šã€å…¥åŠ›ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ãƒ‡ãƒ¼ã‚¿ã‚’入力ã™ã‚‹ã¨ã€onStateUpdatedAction メソッドãŒå‘¼ã³å‡ºã•れã¾ã™ã€‚フィールドタイプをコード内ã§ä¿å­˜ã¾ãŸã¯å‡¦ç†ã§ãã¾ã™ã€‚

例:

// Full-screen presentation
void onboardingViewOnStateUpdatedAction(
  AdaptyUIOnboardingView view,
  AdaptyUIOnboardingMeta meta,
  String elementId,
  AdaptyOnboardingsStateUpdatedParams params,
) {
  // Process data 
}

// Embedded widget
onStateUpdatedAction: (meta, elementId, params) {
  // Process data 
}

アクションã®ãƒ•ォーマットã«ã¤ã„ã¦ã¯ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

å„ params タイプã®ãƒ—ロパティã®å½¢çŠ¶ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void onboardingViewOnStateUpdatedAction(
  AdaptyUIOnboardingView view,
  AdaptyUIOnboardingMeta meta,
  String elementId,
  AdaptyOnboardingsStateUpdatedParams params,
) {
  // elementId 㯠String ã§ã™:
  elementId; // 'preference_selector'

  // meta — AdaptyUIOnboardingMeta:
  meta.onboardingId;   // 'onboarding_123'
  meta.screenClientId; // 'preferences_screen'
  meta.screenIndex;    // 1
  meta.screensTotal;   // 3

  // params 㯠AdaptyOnboardingsStateUpdatedParams ã®ã‚µãƒ–クラスã®ã„ãšã‚Œã‹ã§ã™:
  switch (params) {
    case AdaptyOnboardingsSelectParams(:final id, :final value, :final label):
      // å˜ä¸€ã®é¸æŠžè‚¢
      id;    // 'option_1'
      value; // 'premium'
      label; // 'Premium Plan'
      break;
    case AdaptyOnboardingsMultiSelectParams(:final params):
      // é¸æŠžã•れãŸé¸æŠžè‚¢ã®ãƒªã‚¹ãƒˆã€‚å„è¦ç´ ã¯ AdaptyOnboardingsSelectParams
      params; // [(id: 'interest_1', value: 'sports', label: 'Sports'), (id: 'interest_2', value: 'music', label: 'Music')]
      break;
    case AdaptyOnboardingsInputParams(:final input):
      switch (input) {
        case AdaptyOnboardingsTextInput(:final value):
          value; // 'John Doe'
          break;
        case AdaptyOnboardingsEmailInput(:final value):
          value; // 'user@example.com'
          break;
        case AdaptyOnboardingsNumberInput(:final value):
          value; // 25.0 (double åž‹)
          break;
      }
      break;
    case AdaptyOnboardingsDatePickerParams(:final day, :final month, :final year):
      day;   // 15
      month; // 6
      year;  // 1990
      break;
  }
}

ユースケース

ユーザープロファイルをデータã§è£œå®Œã™ã‚‹

入力ã•れãŸãƒ‡ãƒ¼ã‚¿ã‚’ユーザープロファイルã«ã™ãã«ç´ä»˜ã‘ã¦ã€åŒã˜æƒ…報を二度èžã‹ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’処ç†ã™ã‚‹éš›ã«å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ—ロファイルを更新ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

ãŸã¨ãˆã°ã€name ã¨ã„ㆠID ã®ãƒ†ã‚­ã‚¹ãƒˆãƒ•ィールドã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«åå‰ã‚’入力ã—ã¦ã‚‚らã„ã€ãã®å€¤ã‚’ユーザーã®å (first name) ã¨ã—ã¦è¨­å®šã—ãŸã„å ´åˆã‚„ã€email フィールドã§ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ã‚‚らã„ãŸã„å ´åˆã€ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

// Full-screen presentation
void onboardingViewOnStateUpdatedAction(
  AdaptyUIOnboardingView view,
  AdaptyUIOnboardingMeta meta,
  String elementId,
  AdaptyOnboardingsStateUpdatedParams params,
) {
  // Store user preferences or responses
  if (params is AdaptyOnboardingsInputParams) {
    final builder = AdaptyProfileParametersBuilder();
    
    // Map elementId to appropriate profile field
    switch (elementId) {
      case 'name':
        if (params.input is AdaptyOnboardingsTextInput) {
          builder.setFirstName((params.input as AdaptyOnboardingsTextInput).value);
        }
        break;
      case 'email':
        if (params.input is AdaptyOnboardingsEmailInput) {
          builder.setEmail((params.input as AdaptyOnboardingsEmailInput).value);
        }
        break;
    }
    
    // Update profile
    Adapty().updateProfile(builder.build()).catchError((error) {
      // handle the error
    });
  }
}

// Embedded widget
onStateUpdatedAction: (meta, elementId, params) {
  // Store user preferences or responses
  if (params is AdaptyOnboardingsInputParams) {
    final builder = AdaptyProfileParametersBuilder();
    
    // Map elementId to appropriate profile field
    switch (elementId) {
      case 'name':
        if (params.input is AdaptyOnboardingsTextInput) {
          builder.setFirstName((params.input as AdaptyOnboardingsTextInput).value);
        }
        break;
      case 'email':
        if (params.input is AdaptyOnboardingsEmailInput) {
          builder.setEmail((params.input as AdaptyOnboardingsEmailInput).value);
        }
        break;
    }
    
    // Update profile
    Adapty().updateProfile(builder.build()).catchError((error) {
      // handle the error
    });
  }
}

回答ã«åŸºã¥ã„ã¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’カスタマイズã™ã‚‹

オンボーディングã§ã‚¯ã‚¤ã‚ºã‚’使用ã™ã‚‹ã“ã¨ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’完了ã—ãŸå¾Œã«è¡¨ç¤ºã™ã‚‹ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’カスタマイズã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

ãŸã¨ãˆã°ã€ã‚¹ãƒãƒ¼ãƒ„ã®çµŒé¨“ã«ã¤ã„ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è³ªå•ã—ã€ç•°ãªã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚°ãƒ«ãƒ¼ãƒ—ã«ç•°ãªã‚‹CTAやプロダクトを表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

  1. オンボーディングビルダーã§ã‚¯ã‚¤ã‚ºã‚’追加ã—ã€é¸æŠžè‚¢ã«æ„味ã®ã‚ã‚‹IDを割り当ã¦ã¾ã™ã€‚
experience.webp
  1. IDã«åŸºã¥ã„ã¦ã‚¯ã‚¤ã‚ºã®å›žç­”を処ç†ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚«ã‚¹ã‚¿ãƒ å±žæ€§ã‚’設定ã—ã¾ã™ã€‚
// Full-screen presentation
void onboardingViewOnStateUpdatedAction(
  AdaptyUIOnboardingView view,
  AdaptyUIOnboardingMeta meta,
  String elementId,
  AdaptyOnboardingsStateUpdatedParams params,
) {
  // Handle quiz responses and set custom attributes
  if (params is AdaptyOnboardingsSelectParams) {
    final builder = AdaptyProfileParametersBuilder();
    
    // Map quiz responses to custom attributes
    switch (elementId) {
      case 'experience':
        // Set custom attribute 'experience' with the selected value (beginner, amateur, pro)
        builder.setCustomStringAttribute(params.value, 'experience');
        break;
    }
    
    // Update profile
    Adapty().updateProfile(builder.build()).catchError((error) {
      // handle the error
    });
  }
}

// Embedded widget
onStateUpdatedAction: (meta, elementId, params) {
  // Handle quiz responses and set custom attributes
  if (params is AdaptyOnboardingsSelectParams) {
    final builder = AdaptyProfileParametersBuilder();
    
    // Map quiz responses to custom attributes
    switch (elementId) {
      case 'experience':
        // Set custom attribute 'experience' with the selected value (beginner, amateur, pro)
        builder.setCustomStringAttribute(params.value, 'experience');
        break;
    }
    
    // Update profile
    Adapty().updateProfile(builder.build()).catchError((error) {
      // handle the error
    });
  }
}
  1. セグメントを作æˆã—ã¾ã™ï¼ˆã‚«ã‚¹ã‚¿ãƒ å±žæ€§ã®å€¤ã”ã¨ã«ï¼‰ã€‚
  2. プレースメントを作æˆã—ã€ä½œæˆã—ãŸå„セグメントã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ã‚’追加ã—ã¾ã™ã€‚
  3. アプリã®ã‚³ãƒ¼ãƒ‰ã§ã€ãã®ãƒ—レースメントã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã—ã¾ã™ã€‚オンボーディングã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’é–‹ãボタンãŒã‚ã‚‹å ´åˆã¯ã€ã“ã®ãƒœã‚¿ãƒ³ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¸ã®å¿œç­”ã¨ã—ã¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ã‚³ãƒ¼ãƒ‰ã‚’実装ã—ã¦ãã ã•ã„。
ÿÿÿÿ