Как я могу вывести свойства объекта с помощью этого расширения перечисления во Flutter/Dart?

Я хочу напечатать определенные индивидуализированные свойства объекта с помощью этого расширения - Источник: ЗДЕСЬ

      extension ExtendedIterable<E> on Iterable<E> {
  /// Like Iterable<T>.map but callback have index as second argument
  Iterable<T> mapIndex<T>(T f(E e, int i)) {
    var i = 0;
    return this.map((e) => f(e, i++));
  }

  void forEachIndex(void f(E e, int i)) {
    var i = 0;
    this.forEach((e) => f(e, i++));
  }
}

Я сохраняю пользовательские данные из текстовых полей в поле Hive.

Когда я сделаю следующее ...

      final box = Hive.box(personTable).values.toList();
    final hiveBox = Hive.box(personTable);
    final indexingBox = box.mapIndex((e, i) => 'item$e index$i');
    final Person person = hiveBox.getAt(0);
    print(person);
    print(indexingBox);

Я получаю следующее напечатанное:

      flutter: {John, Biggs, 34, Active}
flutter: (item{John, Biggs, 34, Active} index0, item{Kostas, Panger, 76, Active} index1, item{Ben, Kenobi, 78, Deactivated} index2, ..., item{Luke, Skywalker, 45, Active} index5, item{Darth, Vader, 54, Active} index6)

Я хочу иметь возможность выборочно перечислять каждое свойство объекта по своему усмотрению.

Вот что я хочу напечатать:

  • флаттер: Джон. // индекс 0 firstName
  • flutter: Kostas // индекс 1 firstName
  • flutter: Vader // индекс 6 фамилия

Сохранение класса в ящик Hive:

      import 'package:hive/hive.dart';
part 'person.g.dart';

@HiveType(typeId: 0)
class Person {
  @HiveField(0)
  final String firstName;
  @HiveField(1)
  final String lastName;
  @HiveField(2)
  final String age;
  @HiveField(3)
  final String status;
  Income({
    this.firstName,
    this.lastName,
    this.age,
    this.status,
  });
  @override
  String toString() {
    return '{${this.firstName}, ${this.lastName}, ${this.age}, ${this.status}}';
  }
}

Если я не могу решить эту проблему раз и навсегда, моя голова может взорваться, это часть более широкой картины того, как сделать DataTable очень простым и динамически загружающимся. Помощь приветствуется!

2 ответа

Из своего списка вы можете просто получить firstName и передать его в функцию:

Если вы используете модель:

      class Person {
  final String firstName;
  final String lastName;
  final String age;
  final String status;

  Person(
    this.firstName,
    this.lastName,
    this.age,
    this.status,
  );
  @override
  String toString() {
    return '{${this.firstName}, ${this.lastName}, ${this.age}, ${this.status}}';
  }

  factory Person.fromJson(List<String> list) {
    return Person(list[0], list[1], list[2], list[3]);
  }
}
    
    
void main() {

List<String> listPerson = <String>[];
  
  final box = Hive.box(personTable).values.toList();
  
  box.forEach((element) { final test = element.toString(); listPerson.add(test); print(test); });

List<String> listPersonWithoutBracket = <String>[];

  for (var i = 0; i < listPerson.length; i++) {
    String strWithoutBracket =
        listPerson[i].replaceAll("{", "").replaceAll("}", "").trim();

    listPersonWithoutBracket.add(strWithoutBracket);
  }

  List<List<String>> listPersonResult = <List<String>>[];

  for (var i = 0; i < listPersonWithoutBracket.length; i++) {
    var strSplit = listPersonWithoutBracket[i].split(", ");
    listPersonResult.add(strSplit);
  }
  
  List<Person> listPersonFinal = listPersonResult.map((item) => Person.fromJson(item)).toList();
  
  final allFirstName = listPersonFinal.map((item) {
          return item.firstName;
      });
  
  final indexingBox = allFirstName.mapIndex((e, i) => '$e');
      print(indexingBox);
        
    }

Outputs

 John, Kostas

РЕШЕНО, НАКОНЕЦ !!!

      box.forEachIndex((e, i) {
      final hiveBox = Hive.box(personTable);
      final person = hiveBox.getAt(i) as Person;
      print('${person.firstName}');
    });

Консоль

      flutter: John
flutter: Obi-wan
flutter: Luke
Другие вопросы по тегам