My idea is the first time I add load a list from api and I get GateInLoaded state with some list in it,
Then I can call api Add to add a new item in that list, if the response has no error
here is 3 files of my bloc
gate_in_bloc.dart
part of 'gate_in_bloc.dart';
class GateInState extends Equatable {
const GateInState();
@override
List<Object> get props => [];
}
final class GateInInitial extends GateInState {}
final class GateInLoading extends GateInState {}
final class GateInLoaded extends GateInState {
final List<contGateInModel> listGateIn;
final List<DanhMucDoiTuongModel> listHangTau;
final List<DanhMucDoiTuongModel> listHTNhap;
final List<DanhMucDoiTuongModel> listKichCo;
final List<DanhMucDoiTuongModel> listPhanloaivo;
final List<DanhMucDoiTuongModel> listPhanLoaiHong;
const GateInLoaded({
required this.listGateIn,
required this.listHangTau,
required this.listHTNhap,
required this.listKichCo,
required this.listPhanloaivo,
required this.listPhanLoaiHong,
});
@override
List<Object> get props => [
listGateIn,
listHangTau,
listHTNhap,
listKichCo,
listPhanloaivo,
listPhanLoaiHong
];
GateInLoaded copyWith({
List<contGateInModel>? listGateIn,
List<DanhMucDoiTuongModel>? listHangTau,
List<DanhMucDoiTuongModel>? listHTNhap,
List<DanhMucDoiTuongModel>? listKichCo,
List<DanhMucDoiTuongModel>? listPhanloaivo,
List<DanhMucDoiTuongModel>? listPhanLoaiHong,
}) {
return GateInLoaded(
listGateIn: listGateIn ?? this.listGateIn,
listHangTau: listHangTau ?? this.listHangTau,
listHTNhap: listHTNhap ?? this.listHTNhap,
listKichCo: listKichCo ?? this.listKichCo,
listPhanloaivo: listPhanloaivo ?? this.listPhanloaivo,
listPhanLoaiHong: listPhanLoaiHong ?? this.listPhanLoaiHong,
);
}
}
final class GateInLoadError extends GateInState {
final String error;
const GateInLoadError({required this.error});
}
final class AddGateInError extends GateInLoaded {
final String error;
const AddGateInError(
{required this.error,
required super.listGateIn,
required super.listHangTau,
required super.listHTNhap,
required super.listKichCo,
required super.listPhanloaivo,
required super.listPhanLoaiHong});
}
final class AddGateInSuccess extends GateInLoaded {
final String idCont;
const AddGateInSuccess(
{required this.idCont,
required super.listGateIn,
required super.listHangTau,
required super.listHTNhap,
required super.listKichCo,
required super.listPhanloaivo,
required super.listPhanLoaiHong});
}
final class UpdateGateInError extends GateInLoaded {
final String error;
const UpdateGateInError(
{required this.error,
required super.listGateIn,
required super.listHangTau,
required super.listHTNhap,
required super.listKichCo,
required super.listPhanloaivo,
required super.listPhanLoaiHong});
}
final class UpdateGateInSuccess extends GateInLoaded {
final String idCont;
const UpdateGateInSuccess(
{required this.idCont,
required super.listGateIn,
required super.listHangTau,
required super.listHTNhap,
required super.listKichCo,
required super.listPhanloaivo,
required super.listPhanLoaiHong});
}
gate_in_event.dart
part of 'gate_in_bloc.dart';
sealed class GateInEvent extends Equatable {
const GateInEvent();
@override
List<Object> get props => [];
}
class FetchInitEvent extends GateInEvent {}
class AddNewGateIn extends GateInEvent {
final contGateInModel item;
const AddNewGateIn({required this.item});
}
class UpdateGateIn extends GateInEvent {
final int index;
final contGateInModel item;
const UpdateGateIn({required this.index, required this.item});
}
gate_in_bloc.dart
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:container_repair_tancang/func/gatein/get_list_gatein.dart';
import 'package:container_repair_tancang/func/gatein/insert_edit_gatein.dart';
import 'package:container_repair_tancang/models/gatein/item_cont.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import '../../../../common/common_varriable.dart';
import '../../../../func/danhmuc/get_dmuc.dart';
import '../../../../models/danhmuc_doituong.dart';
part 'gate_in_event.dart';
part 'gate_in_state.dart';
class GateInBloc extends Bloc<GateInEvent, GateInState> {
GateInBloc() : super(const GateInState()) {
on<FetchInitEvent>(fetchInitEvent);
on<AddNewGateIn>(addNewGateIn);
}
FutureOr<void> fetchInitEvent(
FetchInitEvent event, Emitter<GateInState> emit) async {
emit(GateInLoading());
final response = await getListGateIn(listGateInRequest(
TuNgay: DateFormat('dd/MM/yyyy').format(DateTime.now()),
DenNgay: DateFormat('dd/MM/yyyy').format(DateTime.now()),
IDDanhMucHangTau: '',
SoContainer: ''));
if (response.ErrorMsg != '') {
emit(GateInLoadError(error: response.ErrorMsg));
} else {
final listKichCo = await getDmuc(IDDanhMucLoaiDoiTuongKichCoContainer);
final listHTNhap = await getDmuc(IDDanhMucLoaiDoiTuongHinhThucNhap);
final listHangTau = await getDmuc(IDDanhMucLoaiDoiTuongHangTau);
final listPlHong = await getDmuc(IDDanhMucLoaiDoiTuongMaPhanLoaiHong);
final listPlVo = await getDmuc(IDDanhMucLoaiDoiTuongMaPhanLoaiVo);
// check xem lấy dmuc có lỗi không
var tempErr = findEmptyList(
listKichCo, listHTNhap, listHangTau, listPlHong, listPlVo);
if (tempErr != null) {
emit(GateInLoadError(error: 'Lỗi khi tải $tempErr'));
return;
}
Iterable iList = jsonDecode(response.Data);
var listGateIn = List<contGateInModel>.from(
iList.map((e) => contGateInModel.fromMap(e)));
log(listGateIn.length.toString());
emit(GateInLoaded(
listGateIn: listGateIn,
listHTNhap: listHTNhap,
listHangTau: listHangTau,
listKichCo: listKichCo,
listPhanLoaiHong: listPlHong,
listPhanloaivo: listPlVo,
));
}
}
}
Future<List<DanhMucDoiTuongModel>> getDmuc(String id) async {
var response = await getDMucDoiTuong(
DanhMucDoiTuongListRequest(idDanhMucLoaiDoiTuong: id));
Iterable iList = jsonDecode(response.Data);
var result = List<DanhMucDoiTuongModel>.from(
iList.map((e) => DanhMucDoiTuongModel.fromJson(e)));
return result;
}
String? findEmptyList(
List<DanhMucDoiTuongModel>? listKichCo,
List<DanhMucDoiTuongModel>? listHTNhap,
List<DanhMucDoiTuongModel>? listHangTau,
List<DanhMucDoiTuongModel>? listPlHong,
List<DanhMucDoiTuongModel>? listPlVo) {
if (listKichCo == null || listKichCo.isEmpty) return 'listKichCo';
if (listHTNhap == null || listHTNhap.isEmpty) return 'listHTNhap';
if (listHangTau == null || listHangTau.isEmpty) return 'listHangTau';
if (listPlHong == null || listPlHong.isEmpty) return 'listPlHong';
if (listPlVo == null || listPlVo.isEmpty) return 'listPlVo';
return null; // All lists are not empty
}
FutureOr<void> addNewGateIn(
AddNewGateIn event, Emitter<GateInState> emit) async {
var response = await insertGateIn(event.item).then((value) {
if (value.ErrorMsg == '') {
var temp = contGateInModel.fromMap(jsonDecode(value.Data));
// here I want to add it in to the listGateIn of GateInLoaded state before
// I think somthing like state.copyWith bt don't know how
} else {
// show add error state
}
});
}
Already search but I can’t find solution, I can’t use final state = this.state
or some thing else like state.copyWith