Переупорядочиваниеlistview.builder не переупорядочивается

#flutter #flutter-listview

Вопрос:

 import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class Mainpage extends StatefulWidget {
 const Mainpage({Key? key}) : super(key: key);

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

 class _MainpageState extends State<Mainpage> {
   @override
  void initState() {
  super.initState();
SystemChrome.setPreferredOrientations(
    [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
}

@override
Widget build(BuildContext context) {
return Container(color: Colors.white, child: const Cards());
}
}

class Cards extends StatefulWidget {
 const Cards({Key? key}) : super(key: key);

@override
State<Cards> createState() => _CardsState();
}

class _CardsState extends State<Cards> {
@override
Widget build(BuildContext context) {
List<String> list = [
  '1',
  '2',
  '3',
  '4',
  '5',
  '6',
'7',
'8',
'9',
'10',
];

 return Container(
    color: Colors.white,
    child: ReorderableListView.builder(
      padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
      scrollDirection: Axis.horizontal,
      onReorder: (int oldIndex, int newIndex) {
        setState(() {
          if (oldIndex < newIndex) {
            newIndex--;
          }
          final String item = list.removeAt(oldIndex);
          list.insert(newIndex, item);
        });
      },
      itemBuilder: (BuildContext context, int index) {
        return Card(
          key: ValueKey(index),
          child: Container(
            height: MediaQuery.of(context).size.height / 4,
            width: MediaQuery.of(context).size.width / 19,
            alignment: Alignment.bottomCenter,
            child: Text(list[index]),
          ),
        );
      },
      itemCount: list.length,
    ));
}
}
 

Значения списка обновляются при перетаскивании. Но государство не перестраивается. значения списка упорядочены правильно. Но Переупорядоченный список не работает. Я пытаюсь использовать как ReorderableListView.builder, так и ReorderableListView. Это мой полный код. Я не знаю, где я допустил ошибку. Это мой полный код. Кто-нибудь, помогите мне решить эту проблему.

Комментарии:

1. Объявите свой список вне контекста сборки. И следуйте ответу.

2. Это работа, Спасибо… Но мне нужно использовать как reorderlistview.builder, так и перетаскиваемый. Например: Мне нужно перетащить определенное значение списка в другое место, а не во внутренний список. оберните текстовый контейнер перетаскиваемым виджетом, но его виджет не перетаскивается.

3. Хорошая работа. Счастливое кодирование

Ответ №1:

измените свое состояние набора

 setState(() {
            if (newIndex > oldIndex) {
              newIndex -= 1;
            }
              final String item = _products.removeAt(oldIndex);
              list.insert(newIndex, item);

          });

 

Комментарии:

1. Тем не менее, это не работа

2. обновил свой ответ, потому что ваше условие также неверно для справа налево

Ответ №2:

ИЗМЕНИТЬ : После просмотра полного кода, который вы добавили, кажется, что вы объявляете список в начале метода сборки вашего виджета. Список сбрасывается до своих начальных значений каждый раз, когда ваш виджет перестраивается.

Переместите объявление списка в начало класса :

 class Cards extends StatefulWidget {
  const Cards({Key? key}) : super(key: key);
  List<String> list = ['1', '2', '3', '4', '5', '6', '7'];
 

КОНЕЦ РЕДАКТИРОВАНИЯ

Проблема заключается в этой части вашего кода:

 if (oldIndex > newIndex) {
  newIndex = newIndex - 1;
  final String item = list.removeAt(oldIndex);
  list.insert(newIndex, item);
}
 

Он обновляет список только в том случае, если элемент перетаскивается справа налево. И при этом он сдвигает индекс нового элемента на 1 влево.

Что вы, вероятно, хотите сделать, так это обновлять список каждый раз, когда происходит перетаскивание. И поскольку вы будете удалять старый элемент перед добавлением нового, вы хотите уменьшить значение newIndex, если перетаскивание выполняется слева направо.

Код должен быть :

 onReorder: (int oldIndex, int newIndex){
  setState(() {
    if (oldIndex < newIndex){
      newIndex--;
    }
    final String item = list.removeAt(oldIndex);
    list.insert(newIndex, item);
  });
}
 

Комментарии:

1. Нет, это не работает. И все же у меня есть проблема.

2. Можете ли вы рассказать более подробно о своей проблеме? «Государство не перестраивается» на самом деле ничего не значит. «список переупорядочения не работает», ни тогда, когда мы не знаем, какого переупорядочения вы пытаетесь достичь. Что происходит с предоставленным мной кодом, который не соответствует вашим потребностям?

3. Список<Строка> список = [ ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’]; Это мой список. Я оборачиваю конструктор списков переупорядочения контейнером. systemChrome.setPreferredOrientations( [Ориентация устройства. Ландшафтный дизайн, ориентация устройства. LandscapeLeft]); Моя ориентация экрана в альбомной ориентации слева.

4. полный код я обновляю в верхней части. Список обновляется в onReorder, когда я перетаскиваю. но внутри списка itembuilder изменений нет.

5. Всегда легче обнаружить проблему, когда код является общим. Я обновил свой ответ, указав причину, по которой ваш код не работает.