---
updatedAt: 2025-06-10T23:35:01.000Z
agentTools:
  projectIndex: https://airbridge.readme.io/llms.txt
---

# Flutter 3.X.X migration guide

<HTMLBlock>{`
<head>
  <link rel="alternate" hreflang="en" href="https://developers.airbridge.io/v1.1-en/page/flutter-3xx-migration-guide-1" />
  <link rel="alternate" hreflang="ko" href="https://developers.airbridge.io/page/flutter-3xx-migration-guide" />
</head>
`}</HTMLBlock>

# 변경사항

기존에 2.X.X 버전 에 있던 있던 event 전송 API 가 삭제 되고 아래의 API 로 대체 되었습니다.

```javascript dart
static void trackEvent(String category, [ AirbridgeEventOption? option ]) {
    event.trackEvent(category, option);
}
```

option 정보는 null 일 수 있고 해당 정보에 action, label, value, customAttributes, semanticAttributes 사용이 가능합니다.

[이벤트 설정](https://developers.airbridge.io/docs/flutter-sdk#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%EC%86%A1) 에서 자세한 내용을 확인하세요.

> 🚧 2.X.X 버전을 사용하신다면 아래의 Flutter SDK 사용 가이드를 확인 바랍니다.
>
> * [FlutterSDK V2.1.1 사용 가이드](https://developers.airbridge.io/docs/flutter-sdk-v211)

이벤트 전송 관련 된 API 가 변경 되어 이벤트 전송에 따른 코드를 아래와 같이 변경이 필요합니다.\
2.X.X 에서 아래의 method 를 사용 중이라면 `trackEvent(String category, [ AirbridgeEventOption? option ])` 로 전환 해야 합니다.

### 사용자 이벤트 전송 [바로가기](https://developers.airbridge.io/docs/flutter-sdk#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%EC%86%A1)

#### 회원가입

```diff
- Airbridge.event.send(SignUpEvent(user: user));
+ Airbridge.state.setUser(User(
+    ID: ...,
+    email: ...,
+    phone: ...,
+    alias: {},
+    attributes: {},
+ ));
+ Airbridge.trackEvent(AirbridgeCategory.SIGN_UP, option);
```

`Airbridge.event.send(SignUpEvent(user: user))` 를 사용하고 있다면 변경이 필요합니다.\
매개변수로 전달 하던 user 정보를 `Airbridge.state.setUser()` 에 채워주고 `Airbridge.trackEvent(AirbridgeCategory.SIGN_UP, option)` 으로 `SIGN_UP` 이벤트를 전달합니다.

#### 로그인

```diff
- Airbridge.event.send(SignInEvent(user: user));
+ Airbridge.state.setUser(User(
+    ID: ...,
+    email: ...,
+    phone: ...,
+    alias: {},
+    attributes: {},
+ ));
+ Airbridge.trackEvent(AirbridgeCategory.SIGN_IN, option);
```

`Airbridge.event.send(SignInEvent(user: user))` 를 사용하고 있다면 변경이 필요합니다.\
매개변수로 전달 하던 user 정보를 `Airbridge.state.setUser()` 에 채워주고 `Airbridge.trackEvent(AirbridgeCategory.SIGN_IN, option)` 으로 `SIGN_IN` 이벤트를 전달합니다.

#### 로그아웃

```diff
- Airbridge.event.send(SignOutEvent());
+ Airbridge.trackEvent(AirbridgeCategory.SIGN_OUT, option);
+ Airbridge.state.setUser(User());
```

`Airbridge.event.send(SignOutEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.SIGN_OUT, option)` 으로 `SIGN_OUT` 이벤트를 전달하고,\
`Airbridge.state.setUser(())` 에 빈객체를 전달하여 현재 유저정보를 비워주세요.

### 이커머스 이벤트 전송 [바로가기](https://developers.airbridge.io/docs/flutter-sdk#%EC%9D%B4%EC%BB%A4%EB%A8%B8%EC%8A%A4-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%EC%86%A1)

#### 홈 화면 조회

```diff
- Airbridge.event.send(ViewHomeEvent(
-   option: ... 
- ));
+ Airbridge.trackEvent(AirbridgeCategory.HOME_VIEW, option);
```

`Airbridge.event.send(ViewHomeEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.HOME_VIEW, option)` 으로 `HOME_VIEW` 이벤트를 전달합니다.

#### 상품 상세 조회

```diff
- Airbridge.event.send(ViewProductDetailEvent(
-	  option: ...,
-	  products: ...,
- ));
+ Airbridge.event.trackEvent(
+   AirbridgeCategory.PRODUCT_DETAILS_VIEW,
+   AirbridgeEventOption(
+     semanticAttributes: {
+       AirbridgeAttributes.PRODUCTS: [{
+           AirbridgeProduct.PRODUCT_ID: '1',
+           AirbridgeProduct.NAME: 'product A',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 1,
+           AirbridgeProduct.QUANTITY: 1,
+         },
+       ]
+     }
+ ));
```

`Airbridge.event.send(ViewProductDetailEvent())`  를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.PRODUCT_DETAILS_VIEW, option)` 으로 `PRODUCT_DETAILS_VIEW` 이벤트를 전달합니다.\
기존 api 의 매개변수에 값을 option 에 객체에 담아서 전달 한다.

> `product` => `semanticAttributes.[AirbridgeAttributes.PRODUCTS]`

#### 상품 리스트 조회

```diff
- Airbridge.event.send(ViewProductListEvent(
-	  option: ...,
-   listID: ...,
-	  products: ...,
- ));
+ Airbridge.event.trackEvent(
+   AirbridgeCategory.PRODUCT_DETAILS_VIEW,
+   AirbridgeEventOption(
+     semanticAttributes: {
+.      AirbridgeAttributes.PRODUCT_LIST_ID: 'ID-1234567890',
+       AirbridgeAttributes.PRODUCTS: [{
+           AirbridgeProduct.PRODUCT_ID: '1',
+           AirbridgeProduct.NAME: 'product A',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 1,
+           AirbridgeProduct.QUANTITY: 1,
+         }, {
+           AirbridgeProduct.PRODUCT_ID: '2',
+           AirbridgeProduct.NAME: 'product B',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 2,
+           AirbridgeProduct.QUANTITY: 1,
+         },
+       ]
+     }
+ ));
```

`Airbridge.event.send(ViewProductListEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.PRODUCT_LIST_VIEW, option)` 으로 `PRODUCT_LIST_VIEW` 이벤트를 전달합니다.\
기존 api 의 매개변수에 값을 option 에 객체에 담아서 전달 한다.

> `listID` => `semanticAttributes.[AirbridgeAttributes.PRODUCT_LIST_ID]`\
> `product` => `semanticAttributes.[AirbridgeAttributes.PRODUCTS]`

#### 검색결과 조회

```diff
- Airbridge.event.send(ViewSearchResultEvent(
-	  option: ...,
-   query: ...,
-	  products: ...,
- ));
+ Airbridge.event.trackEvent(
+   AirbridgeCategory.PRODUCT_DETAILS_VIEW,
+   AirbridgeEventOption(
+     semanticAttributes: {
+       AirbridgeAttributes.QUERY: 'query-viewSearchResult',
+       AirbridgeAttributes.PRODUCTS: [{
+           AirbridgeProduct.PRODUCT_ID: '1',
+           AirbridgeProduct.NAME: 'product A',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 1,
+           AirbridgeProduct.QUANTITY: 1,
+         }, {
+           AirbridgeProduct.PRODUCT_ID: '2',
+           AirbridgeProduct.NAME: 'product B',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 2,
+           AirbridgeProduct.QUANTITY: 1,
+         },
+       ]
+     }
+ ));
```

`Airbridge.event.send(ViewSearchResultEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.SEARCH_RESULT_VIEW, option)` 으로 `SEARCH_RESULT_VIEW` 이벤트를 전달합니다.\
기존 api 의 매개변수에 값을 option 에 객체에 담아서 전달 한다.

> `query` => `semanticAttributes.[AirbridgeAttributes.QUERY]`\
> `product` => `semanticAttributes.[AirbridgeAttributes.PRODUCTS]`

#### 장바구니 담기

```diff
- Airbridge.event.send(AddToCartEvent(
-	  option: ...,
-   cartID: ...,
-	  products: ...,
-   currency: ...,
-   totalValue: 30000,
- ));
+ Airbridge.event.trackEvent(
+   AirbridgeCategory.ADD_TO_CART,
+   AirbridgeEventOption(
+     semanticAttributes: {
+       AirbridgeAttributes.CART_ID: 'ID-1234567890',
+       AirbridgeAttributes.CURRENCY: 'KRW',
+       AirbridgeAttributes.TOTAL_VALUE: 2000000,
+       AirbridgeAttributes.PRODUCTS: [{
+           AirbridgeProduct.PRODUCT_ID: '1',
+           AirbridgeProduct.NAME: 'product A',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 1,
+           AirbridgeProduct.QUANTITY: 1,
+         }, {
+           AirbridgeProduct.PRODUCT_ID: '2',
+           AirbridgeProduct.NAME: 'product B',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 2,
+           AirbridgeProduct.QUANTITY: 1,
+         },
+       ]
+     }
+ ));
```

`Airbridge.event.send(AddToCartEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.ADD_TO_CART, option)` 으로 `ADD_TO_CART` 이벤트를 전달합니다.\
기존 api 의 매개변수에 값을 option 에 객체에 담아서 전달 한다.

> `cartID` => `semanticAttributes.[AirbridgeAttributes.CART_ID]`\
> `product` => `semanticAttributes.[AirbridgeAttributes.PRODUCTS]`\
> `currency` => `semanticAttributes.[AirbridgeAttributes.CURRENCY]`\
> `totalValue` => `semanticAttributes.[AirbridgeAttributes.TOTAL_VALUE]`

#### 결제

```diff
- Airbridge.event.send(PurchaseEvent(
-	  option: ...,
-   cartID: ...,
-	  products: ...,
-   currency: ...,
-   totalValue: 30000,
- ));
+ Airbridge.event.trackEvent(
+   AirbridgeCategory.ORDER_COMPLETED,
+   AirbridgeEventOption(
+     semanticAttributes: {
+       AirbridgeAttributes.TRANSACTION_ID: 'transactionID-purchase',
+       AirbridgeAttributes.IN_APP_PURCHASED: true,
+       AirbridgeAttributes.CURRENCY: 'KRW',
+       AirbridgeAttributes.TOTAL_VALUE: 50000,
+       AirbridgeAttributes.PRODUCTS: [{
+           AirbridgeProduct.PRODUCT_ID: '1',
+           AirbridgeProduct.NAME: 'product A',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 1,
+           AirbridgeProduct.QUANTITY: 1,
+         }, {
+           AirbridgeProduct.PRODUCT_ID: '2',
+           AirbridgeProduct.NAME: 'product B',
+           AirbridgeProduct.PRICE: 1000000,
+           AirbridgeProduct.CURRENCY: 'KRW',
+           AirbridgeProduct.POSITION: 2,
+           AirbridgeProduct.QUANTITY: 1,
+         },
+       ]
+     }
+ ));
```

`Airbridge.event.send(PurchaseEvent())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED, option)` 으로 `ORDER_COMPLETED` 이벤트를 전달합니다.\
기존 api 의 `purchaseEvent` 의 매개변수에 값을 option 에 객체에 담아서 전달 한다.

> `transactionID` => `semanticAttributes.[AirbridgeAttributes.TRANSACTION_ID]`\
> `product` => `semanticAttributes.[AirbridgeAttributes.PRODUCTS]`\
> `isInAppPurchase` => `semanticAttributes.[AirbridgeAttributes.IN_APP_PURCHASED]`\
> `totalValue` => `semanticAttributes.[AirbridgeAttributes.TOTAL_VALUE]`

### 사용자 이벤트

```diff
- Airbridge.event.send(Event(
-	  category: ...,
-   option: ...,
- ));
+ Airbridge.trackEvent(category, option);
```

`Airbridge.event.send(Event())` 를 사용하고 있다면 변경이 필요합니다.\
`Airbridge.trackEvent(category, option)` 으로 이벤트를 전달합니다.