SliverChildBuilderDelegate Не восстанавливать дочерние элементы при изменении данных с помощью setState - PullRequest
0 голосов
/ 25 марта 2020

У меня есть пользовательский интерфейс, который показывает пользователю доставленные Предметы и отмененные товары в продуктовом приложении.

'Доставлено' -> нажатие этой кнопки показывает виджеты доставленных карточек предметов.

и на той же странице

'Отменено' -> при нажатии этой кнопки отображаются виджеты карты отмененных элементов.

Я использую SliverChildBuilderDelegate для создания карты виджеты на основе текущего ввода пользователя. (Первоначально, когда страница загружена, я показываю все доставленные элементы.)

SliverList(
              delegate: SliverChildBuilderDelegate(
                (context, index) => MyOrdersCard(
                  orderNumber: orderList[index][0],
                  trackingNumber: orderList[index][1],
                  quantity: orderList[index][2],
                  totalAmount: orderList[index][3],
                  status: orderList[index][4],
                  date: orderList[index][5],
                  statusColor: orderList[index][6],
                ),
                childCount: orderList.length,
              ),
            ),

Я заполняю список ('orderList') в приведенном ниже коде с помощью переменная состояния, имеющая статус заказа.

var orderList = [];

handleClick(status) {

     setState(() {

          orderList = [];

          var color;
          switch (status) {
              case 'Processing':
                color = Colors.yellow;
                activeBtn = 2;
                break;
              case 'Cancelled':
                color = Colors.red;
                activeBtn = 3;
                break;
              case 'Delivered':
                color = Colors.green;
                activeBtn = 1;
                break;
          }
          for (int i = 0; i < 10; i++) {
                  orderList.add([
                    '123457' + '$i',
                    '17abc999',
                    3,
                    500,
                    status,
                    '0$i-12-2019',
                    color
                  ]);
          }

});

При нажатии кнопки вызывается вышеуказанная функция со статусом в качестве аргумента.

        RaisedButton(
                      child: Text('Delivered'),                      
                      onPressed: () {
                        handleClick('Delivered');
                      },
                    ),
        RaisedButton(
                      child: Text('Processing'),
                      onPressed: () {
                        handleClick('Processing');
                      },
                    ),

Теперь пользовательский интерфейс правильно отображает все доставленные элементы карты, но если пользователь нажимает кнопку «Отменено», то вызывается функция «handleClick» и список, если он заполнен всеми новыми заказами и статусом cancelld, имеет статус также заполнено как отменено. Но sliverChildBuilder не обновляется. Пользовательский интерфейс остается прежним. Если я прокручиваю ниже, то я могу видеть отмененные заказы, потому что они создаются заново, когда происходит прокрутка вниз. Теперь, если я прокручиваю вверх снова, я вижу все отмененные заказы, потому что старые построенные карты были уничтожены, а sliverChildBuilder создал карты как прокрутка произошла на лету. Я не хочу этого Я хочу, чтобы sliverChildBuilder уничтожил все старые дочерние элементы, созданные для «доставленных» элементов при нажатии кнопки «отменено», и отобразил все новые отмененные заказы из нового списка («список-заказов»). Есть ли способ, которым я мог бы сделать это? Надеюсь, моя проблема ясна!

...