[Flutter] 플러터 #21 - AutoDisposeModifier
AutoDisposeModifier에 대해서 알아보겠습니다.
AutoDisposeModifier는 Riverpod에서 제공하는 기능 중 하나로, Provider가 더 이상 사용되지 않을 때 자동으로 제거되도록 도와줍니다. 이를 통해 메모리 누수와 관련된 문제를 방지하고 애플리케이션의 성능과 안정성을 향상시킬 수 있습니다.
AutoDisposeModifier의 개념을 이해하기 위해 Provider의 생명주기를 간략히 살펴보겠습니다. 일반적으로 Provider는 사용자에게 데이터를 제공하고 해당 데이터가 필요하지 않을 때까지 유지됩니다. 그러나 Provider를 사용하는 위젯이 해제되거나 다른 상태로 전환될 때 Provider는 수동으로 제거되어야 합니다. 이러한 수동 제거 과정을 자동으로 처리해주는 것이 AutoDisposeModifier입니다.
AutoDisposeModifier의 장점은 다음과 같습니다:
- 메모리 관리: AutoDisposeModifier를 사용하면 Provider가 더 이상 사용되지 않을 때 자동으로 제거되므로 메모리 누수를 방지할 수 있습니다. 사용하지 않는 Provider가 메모리에 남아있는 상황을 방지하여 애플리케이션의 성능과 안정성을 향상시킵니다.
- 편의성: AutoDisposeModifier를 사용하면 Provider의 수동 제거 과정을 처리할 필요가 없으므로 코드를 간결하게 유지할 수 있습니다. 제거 작업을 자동화하여 개발자가 신경 써야 할 부분을 줄여줍니다.
AutoDisposeModifier의 사용방법은 다음과 같습니다:
- AutoDisposeModifier를 사용하려는 Provider에 `.autoDispose`를 추가하여 정의합니다. 이렇게 함으로써 해당 Provider는 사용하지 않을 때 자동으로 제거되도록 설정됩니다.
- AutoDisposeModifier를 사용하는 ConsumerWidget에서는 AutoDisposeWidget을 상속받아야 합니다. AutoDisposeWidget은 해당 위젯이 속한 위젯 트리가 변경될 때 Provider의 상태를 관찰하고 자동으로 처리합니다.
- AutoDisposeModifier를 사용하는 ConsumerWidget 내에서 해당 Provider를 구독하고 상태를 관찰합니다. Provider를 사용하는 위젯이 해제되거나 다른 상태로 전환되면 자동으로 Provider가 제거됩니다.
AutoDisposeModifier의 예시를 살펴보겠습니다.
autoDisposeModifierProvider를 정의한 코드입니다.
// 어떤 Provider를 사용해도 문제는 없는데, 일단 여기선 future provider을 사용할 예정
import 'package:flutter_riverpod/flutter_riverpod.dart';
// .family와 다르게 값을 자동으로 삭제해주는 개념이라 data와 같은 추가적인 데이터가 들어가지 않음
// ** autoDispose와 family의 차이점 **
// autoDispose는 자동으로 값을 삭제하는 것이기에 필요없을 때 삭제하고, 필요할 때 다시 생성한다.
// family를 비롯하여 future provider의 경우 데이터를 캐싱하기에 페이지에서 나간 후 다시 들어가면 로딩 인디케이터가 뜨지 않지만
// autoDispose는 페이지에서 나갈 경우, 데이터가 삭제되기에 다시 들어가면 로딩 인디케이터가 다시 뜬다는 특징이 있다.
// 결론: 그래서 autoDispose provider를 사용하는 이유는 사용하지 않을 때는 데이터가 삭제되어야 하는 provider를 생성할때 이 키워드를 사용한다..
final autoDisposeModifierProvider =
FutureProvider.autoDispose<List<int>>((ref) async {
await Future.delayed(Duration(seconds: 2));
return [1, 2, 3, 4, 5];
});
- autoDisposeModifierProvider는 FutureProvider.autoDispose를 사용하여 생성된 Provider입니다.
- Provider의 값은 List<int> 형태이며, ref를 매개변수로 받는 비동기 함수 내에서 데이터를 반환합니다.
- autoDisposeModifierProvider는 자동으로 값이 삭제되는 Provider이므로, 해당 Provider를 사용하지 않을 때는 값이 제거되고, 다시 사용할 때는 값이 다시 생성됩니다.
다음은 autoDisposeModifierProvider를 구독한 코드입니다.
import 'package:ex_state/riverpod/auto_dispose_modifier_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class AutoDisposeModifierScreen extends ConsumerWidget {
const AutoDisposeModifierScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(autoDisposeModifierProvider);
return DefaultLayout(
title: 'AutoDisposeModifierScreen',
body: Center(
child: state.when(
data: (data) => Text(data.toString()),
error: (err, stack) => Text(err.toString()),
loading: () => CircularProgressIndicator(),
)
),
);
}
}
- AutoDisposeModifierScreen은 ConsumerWidget을 상속받은 위젯입니다.
- ref.watch(autoDisposeModifierProvider)를 통해 autoDisposeModifierProvider를 구독하고 해당 Provider의 상태를 관찰합니다.
- state.when을 사용하여 Provider의 상태에 따라 적절한 위젯을 반환합니다.
위 코드들의 실행결과입니다.
- autoDisposeModifierProvider는 2초의 딜레이 후에 [1, 2, 3, 4, 5]를 반환합니다.
- 위젯이 처음 빌드될 때는 로딩 인디케이터가 표시됩니다.
- 2초 후에 데이터가 준비되면 data 콜백이 호출되고, 데이터가 텍스트로 출력됩니다.
AutoDisposeModifier의 역할은 사용하지 않을 때 자동으로 Provider를 제거하는 것입니다. 예시 코드에서는 autoDisposeModifierProvider를 사용하지 않을 때 해당 Provider의 값이 삭제되고, 다시 사용할 때 값이 다시 생성됩니다. 이를 통해 불필요한 메모리 사용을 방지하고, 필요한 시점에서만 Provider를 유지하여 애플리케이션의 성능과 메모리 관리를 개선할 수 있습니다.
AutoDisposeModifier를 사용하면 Provider의 수동 제거 과정을 자동화하여 메모리 누수와 관련된 문제를 방지할 수 있습니다. 이를 통해 개발자는 메모리 관리에 신경 쓰지 않고 애플리케이션의 핵심 로직에 집중할 수 있습니다.