상태가 많아지는 걸 대비할 수 있도록
Freezed를 사용하여 상태관리 클래스로 만들었습니다.
불변 객체로, copy를 제공합니다. (state.copyWith)
이로써, 수정이 제한적인 안전한 코드를 작성할 수 있습니다.
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);
}
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();
}
}