google / built_collection.dart

Immutable Dart collections via the builder pattern.
https://pub.dev/packages/built_collection
BSD 3-Clause "New" or "Revised" License
275 stars 52 forks source link

(Question) how to rebuild every value in BuiltList? #250

Open linxkaa opened 2 years ago

linxkaa commented 2 years ago

I'm new to built list, there's this thing I cant understand, so I have a model called AdressShipmentModel

In that model i have this value (I'm using freezed package)

@freezed
abstract class AdressShipmentModel with _$AdressShipmentModel {
  const factory AdressShipmentModel({
    required int addrId,
    required String label,
    required String receiverName,
    required String receiverPhone,
    required String address,
    required String isDefault,
    required int locationId,
    required String locationName,
    required String latlng,
    @Default(false) @JsonKey(ignore: true) bool isChoosenAddress,
  }) = _AdressShipmentModel;

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

The goal is to modify the model that choose by user is default by parameter isChoosenAddress

By this code I'm able to modify the choosen address to true if isDefault parameter is "1".

  initialData() {
    List<AdressShipmentModel> oldValue = value.toList();
    List<AdressShipmentModel> newValue = [];
    oldValue.forEach((e) {
      if (e.isDefault == "1") {
        newValue.add(e.copyWith(isChoosenAddress: true));
      } else {
        newValue.add(e.copyWith(isChoosenAddress: false));
      }
    });

    return ChoosenAddressEntities._(BuiltList<AdressShipmentModel>(newValue));
  }

But this was the old method of modifying list, and there's really no need for built_collection package if I do it like this.

When I use .rebuild(), it will not modify list as I wanted, both of the isChoosenAddress was set to false. (Not modified) image

Is there's something I do wrong? Any kind of explanation will be so much appreciated! Thank you :)

This was my full code of logic:

import 'package:built_collection/built_collection.dart';
import 'package:equatable/equatable.dart';
import '/infrastructure/models/settings/address_shipment_model.dart';

class ChoosenAddressEntities extends Equatable {
  final BuiltList<AdressShipmentModel> value;
  const ChoosenAddressEntities._(this.value);
  factory ChoosenAddressEntities(List<AdressShipmentModel> listOfCart) =>
      ChoosenAddressEntities._(BuiltList<AdressShipmentModel>(listOfCart));

  updateChoosenAddress({
    required int id,
  }) {
    int index = _getAddressByIndex(id);
    BuiltList<AdressShipmentModel> newValue = value.rebuild((e) {
      e[index] = e[index].copyWith(isChoosenAddress: true);

      return _replaceRange(index: index, newAddressItem: e[index]);
    })
      ..forEach((e) {
        if (e.addrId != index) {
          e.copyWith(isChoosenAddress: false);
        }
      });
    return ChoosenAddressEntities._(newValue);
  }

  initialData() {
    List<AdressShipmentModel> oldValue = value.toList();
    List<AdressShipmentModel> newValue = [];
    oldValue.forEach((e) {
      if (e.isDefault == "1") {
        newValue.add(e.copyWith(isChoosenAddress: true));
      } else {
        newValue.add(e.copyWith(isChoosenAddress: false));
      }
    });

    return ChoosenAddressEntities._(BuiltList<AdressShipmentModel>(newValue));
  }

  int _getAddressByIndex(int id) {
    return value.indexOf(value.firstWhere((e) => e.addrId == id));
  }

  BuiltList<AdressShipmentModel> _replaceRange({
    required int index,
    AdressShipmentModel? newAddressItem,
  }) {
    return value.rebuild(
      (a) => a
        ..replaceRange(
          index,
          index + 1,
          newAddressItem != null ? [newAddressItem] : [],
        ),
    );
  }

  @override
  // TODO: implement props
  List<Object?> get props => [value];
}
dave26199 commented 2 years ago

Rebuild should work as you want; I can't see a problem in your code.

e.g.

var newList = old list.rebuild((x) => x.map((v) => v + 1))

to add one to every value in the list.

On Thu, Aug 19, 2021, 16:35 Lintang Kusuma @.***> wrote:

I'm new to built list, there's this thing I cant understand, so I have a model called AdressShipmentModel

In that model i have this value (I'm using freezed package)

@freezed abstract class AdressShipmentModel with _$AdressShipmentModel { const factory AdressShipmentModel({ required int addrId, required String label, required String receiverName, required String receiverPhone, required String address, required String isDefault, required int locationId, required String locationName, required String latlng, @Default(false) @JsonKey(ignore: true) bool isChoosenAddress, }) = _AdressShipmentModel;

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

The goal is to modify the model that choose by user is default by parameter isChoosenAddress

By this code I'm able to modify the choosen address to true if isDefault parameter is "1".

initialData() { List oldValue = value.toList(); List newValue = []; oldValue.forEach((e) { if (e.isDefault == "1") { newValue.add(e.copyWith(isChoosenAddress: true)); } else { newValue.add(e.copyWith(isChoosenAddress: false)); } });

return ChoosenAddressEntities._(BuiltList<AdressShipmentModel>(newValue));

}

But this was the old method of modifying list, and there's really no need for built_collection package if I do it like this.

When I use .rebuild(), it will not modify list as I wanted, both of the isChoosenAddress was set to false. (Not modified) [image: image] https://user-images.githubusercontent.com/57997512/130087665-e7d9a424-b925-49e1-b685-0ea32fd38227.png

Is there's something I do wrong? An explanation will be so much appreciated! Thank you :)

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/google/built_collection.dart/issues/250, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADAZMCU2VY332RM7NNM36FTT5UJDFANCNFSM5COLT5JA . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email .