#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. Всегда легче обнаружить проблему, когда код является общим. Я обновил свой ответ, указав причину, по которой ваш код не работает.