[Flutter] Freezed

Comely·2024년 11월 16일

Flutter

목록 보기
16/26

1. 상태관리 home_state.dart

상태가 많아지는 걸 대비할 수 있도록
Freezed를 사용하여 상태관리 클래스로 만들었습니다.
불변 객체로, copy를 제공합니다. (state.copyWith)

이로써, 수정이 제한적인 안전한 코드를 작성할 수 있습니다.

  • photos
  • isLoading
import 'package:image_search/domain/model/photo.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'home_state.freezed.dart';

part 'home_state.g.dart';


class HomeState with _$HomeState {
  factory HomeState(
    List<Photo> photos,
    bool isLoading,
  ) = _HomeState;

  factory HomeState.fromJson(Map<String, dynamic> json) => _$HomeStateFromJson(json);
}

2. ViewModel

class HomeViewModel with ChangeNotifier {
  final GetPhotosUseCase getPhotosUseCase;

  HomeState _state = HomeState([], false);

  HomeState get state => _state;

  final _eventController = StreamController<HomeUiEvent>();

  Stream<HomeUiEvent> get eventStream => _eventController.stream;

  HomeViewModel(this.getPhotosUseCase);

  Future<void> fetch(String query) async {
    _state = state.copyWith(isLoading: true);
    notifyListeners();

    final Result<List<Photo>> result = await getPhotosUseCase(query);

    result.when(
      success: (photos) {
        _state = state.copyWith(photos: photos);
        notifyListeners();
      },
      error: (message) {
        _eventController.add(HomeUiEvent.showSnackBar(message));
      },
    );
    _state = state.copyWith(isLoading: false);
    notifyListeners();
  }
}
profile
App, Web Developer

0개의 댓글