Как читать данные через несколько классов в Flutter?

#flutter #dart

#flutter #dart

Вопрос:

Я работаю над проектом Flutter на работе, и я достиг плато..

У меня есть папка models, в которой я создал класс, который в основном содержит список объектов с определенным свойством, которое я хотел бы изменить внутри виджета. Затем я хотел бы, чтобы изменение этого свойства было отражено в списке впоследствии, чтобы затем можно было прочитать свойство в другом виджете / экране. Я могу легко изменить свойство ВНУТРИ виджета, но из-за области действия изменение НЕ отражается в списке из папки models.

У меня есть экран, на котором я отображаю несколько виджетов карты. Эти виджеты card отображаются и создаются на основе ранее упомянутого списка объектов. У каждой карты есть конструктор, который принимает три свойства, ОДНО из этих свойств — это конкретное свойство, которое я хотел бы иметь возможность читать, когда оно изменяется внутри состояния виджета карты. Однако я не знаю, как это сделать.

Список<Объект (свойство 1, свойство 2, свойство 3)> -> Карточка построения (свойство 1, свойство 2, свойство 3) -> изменение свойства 3 внутри карточки. Как мне изменить фактическое свойство внутри списка?

  1. Это список, на который я ссылаюсь.
 class AvailablePlans {
  static List<PlanCard> planChoices = [
    PlanCard(
      plan: 'American Football',
      isMarked: false,
      variants: [''],
    ),
    PlanCard(
      plan: 'Soccer',
      isMarked: false,
      variants: [
        'Soccer 11v11',
        'Soccer US 9v9',
        'Soccer US 7v7',
        'Soccer US 4v4',
        'Soccer DBU 8v8',
        'Soccer DBU 5v5',
        'Soccer DBU 3v3',
        'Soccer SvFF 3v3',
        'Soccer SvFF 5v5',
        'Soccer SvFF 7v7',
        'Soccer SvFF 9v9',
      ],
    ),
    PlanCard(
      plan: 'Baseball',
      isMarked: false,
      variants: [],
    ),
    PlanCard(
      plan: 'Standard Geometry',
      isMarked: false,
      variants: [],
    ),
    PlanCard(
      plan: 'Extended Geometry',
      isMarked: false,
      variants: [],
    ),
    PlanCard(
      plan: 'Free Form Text',
      isMarked: false,
      variants: [],
    ),
  ];
  
  1. Это изнутри экрана / виджета, в котором создается каждая карта со свойствами из списка. Свойство, которое я хотел бы прочитать, — это свойство ‘isMarked’!
 SliverList(
            delegate: SliverChildBuilderDelegate(
              (context, index) {
                return PlanCard(
                  plan: plans[index].plan,
                  isMarked: plans[index].isMarked,
                  variants: plans[index].variants,
                );
              },
              childCount: plans.length,
            ),
          ),
  
  1. Внутри виджета Card, где я изменяю локальную переменную isMarked в setState. Однако я хотел бы также изменить ФАКТИЧЕСКОЕ свойство isMarked для нужного объекта внутри списка.
 class PlanCard extends StatefulWidget {
  final String plan;
  final List<String> variants;
  bool isMarked;
  bool isExpanded = false;

  PlanCard({this.plan, this.isMarked, this.variants});

  @override
  _PlanCardState createState() => _PlanCardState();
}

class _PlanCardState extends State<PlanCard> {
  void _saveStateFromBoxes() {
    setState(() {
      widget.isMarked = !widget.isMarked;
      print(widget.isMarked);
    });
  }
  

Ответ №1:

Чтобы получить доступ к отдельному свойству списка, вам нужно получить доступ к каждому элементу, а затем вызвать свойство.

 class PlanCardView extends StatelessWidget {
  final List<PlanCard> planCards;

  PlanCardView({
    Key key,
    this.planCards,
  }) : super(key: key);
   
  Widget build(BuildContext context) {
    return ListView.builder(
      scrollDirection: Axis.horizontal,
      itemCount: planCards.length,
      itemBuilder: (BuildContext context, int index) {
        PlanCard planCard = planCards[index]; //getData;
        return Container(
          child:Text(planCard.isMarked)  //access isMarked
      );
    }
  );
}
  

Вам нужно передать список карточек в этот класс, и тогда он напечатает все свойства isMarked в текстовом виджете