vietmap_reorderable_list 0.0.6
vietmap_reorderable_list: ^0.0.6 copied to clipboard
A new Flutter reordable list package project.
example/lib/main.dart
import 'package:flutter/material.dart' hide ReorderableListView;
import 'package:intl/intl.dart';
import 'package:vietmap_reorderable_list/widgets/vietmap_reorderable_list.dart';
void main() => runApp(const ReorderableApp());
class ReorderableApp extends StatelessWidget {
const ReorderableApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('ReorderableListView Sample')),
body: const ReorderableExample(),
),
);
}
}
class MockData {
final String name;
final int timeStamp;
MockData({required this.name, required this.timeStamp});
}
class ReorderableExample extends StatefulWidget {
const ReorderableExample({super.key});
@override
State<ReorderableExample> createState() => _ReorderableListViewExampleState();
}
class _ReorderableListViewExampleState extends State<ReorderableExample> {
final List<int> _items = List<int>.generate(50, (int index) => index);
List<GlobalKey> itemKeys = [];
ScrollController scrollController = ScrollController();
final List<MockData> data = [
MockData(name: 'Item 1', timeStamp: 1710992339000),
MockData(name: 'Item 2', timeStamp: 1710993339000),
MockData(name: 'Item 3', timeStamp: 1710994339000),
MockData(name: 'Item 4', timeStamp: 1710995339000),
MockData(name: 'Item 5', timeStamp: 1710996339000),
MockData(name: 'Item 6', timeStamp: 1710997339000),
MockData(name: 'Item 7', timeStamp: 1710998339000),
MockData(name: 'Item 8', timeStamp: 1710999339000),
MockData(name: 'Item 9', timeStamp: 1711000339000),
MockData(name: 'Item 10', timeStamp: 1711001339000),
MockData(name: 'Item 11', timeStamp: 1711002339000),
MockData(name: 'Item 12', timeStamp: 1711003339000),
MockData(name: 'Item 13', timeStamp: 1711004339000),
MockData(name: 'Item 14', timeStamp: 1711005339000),
MockData(name: 'Item 15', timeStamp: 1711006339000),
MockData(name: 'Item 16', timeStamp: 1711007339000),
MockData(name: 'Item 17', timeStamp: 1711008339000),
MockData(name: 'Item 18', timeStamp: 1711009339000),
MockData(name: 'Item 19', timeStamp: 1711010339000),
MockData(name: 'Item 20', timeStamp: 1711011339000),
MockData(name: 'Item 21', timeStamp: 1711012339000),
MockData(name: 'Item 22', timeStamp: 1711013339000),
MockData(name: 'Item 23', timeStamp: 1711014339000),
MockData(name: 'Item 24', timeStamp: 1711015339000),
MockData(name: 'Item 25', timeStamp: 1711016339000),
MockData(name: 'Item 26', timeStamp: 1711017339000),
MockData(name: 'Item 27', timeStamp: 1711018339000),
MockData(name: 'Item 28', timeStamp: 1711019339000),
MockData(name: 'Item 29', timeStamp: 1711020339000),
MockData(name: 'Item 30', timeStamp: 1711021339000),
MockData(name: 'Item 31', timeStamp: 1711022339000),
MockData(name: 'Item 32', timeStamp: 1711023339000),
MockData(name: 'Item 33', timeStamp: 1711024339000),
MockData(name: 'Item 34', timeStamp: 1711025339000),
MockData(name: 'Item 35', timeStamp: 1711026339000),
MockData(name: 'Item 36', timeStamp: 1711027339000),
MockData(name: 'Item 37', timeStamp: 1711028339000),
MockData(name: 'Item 38', timeStamp: 1711029339000),
MockData(name: 'Item 39', timeStamp: 1711030339000),
MockData(name: 'Item 40', timeStamp: 1711031339000),
MockData(name: 'Item 41', timeStamp: 1711032339000),
MockData(name: 'Item 42', timeStamp: 1711033339000),
MockData(name: 'Item 43', timeStamp: 1711034339000),
MockData(name: 'Item 44', timeStamp: 1711035339000),
MockData(name: 'Item 45', timeStamp: 1711036339000),
MockData(name: 'Item 46', timeStamp: 1711037339000),
MockData(name: 'Item 47', timeStamp: 1711038339000),
MockData(name: 'Item 48', timeStamp: 1711039339000),
MockData(name: 'Item 49', timeStamp: 1711040339000),
MockData(name: 'Item 50', timeStamp: 1711041339000),
];
@override
void initState() {
scrollController.addListener(() {
// print('+++++++++++++++++++++++++++++++++++++++++');
// print(scrollController.position.pixels);
});
super.initState();
}
@override
Widget build(BuildContext context) {
final ColorScheme colorScheme = Theme.of(context).colorScheme;
final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
final Color evenItemColor = colorScheme.primary.withOpacity(0.15);
return Container(
color: Colors.red.withOpacity(0.2),
child: Stack(
children: [
Positioned(
top: 0,
left: 95,
child: Container(
width: 5,
height: MediaQuery.sizeOf(context).height,
color: Colors.red,
),
),
VietmapReorderableListView(
scrollController: scrollController,
padding: const EdgeInsets.symmetric(horizontal: 40),
onReorderStart: (index) {
// print('-----------------zzz');
},
children: List.generate(50, (index) {
itemKeys.add(GlobalKey());
return Listener(
onPointerMove: (event) {
// print(event.position.dy);
// print('-----------------Pointer Move-----------------');
},
key: itemKeys[index],
// onVerticalDragUpdate: (details) {
// print('---------------d-----------------');
// },
child: ListTile(
contentPadding: EdgeInsets.zero,
tileColor: Colors.transparent,
leading: Text(formatTime(data[index].timeStamp)),
title: Container(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 15),
decoration: BoxDecoration(
color:
_items[index].isOdd ? oddItemColor : evenItemColor,
),
child: Text('Item ${_items[index]}')),
),
);
}),
onReordering: (index, dragIndex) {
print('-----------------reordering$index, $dragIndex');
MockData nearestTopData = data[dragIndex - 2];
MockData currentData = data[dragIndex - 1];
MockData nearestBottomData = data[dragIndex];
// print(nearestTopData.name);
// print(currentData.name);
// print(nearestBottomData.name);
// print('----------------------------------');
// print(_getPosition(dragIndex - 2));
// print(_getPosition(dragIndex - 1));
// print(_getPosition(dragIndex));
// print('--------------------enda--------------');
// print(nearestTopData.timeStamp);
// print(nearestBottomData.timeStamp);
},
onReorderEnd: (index) {
// print('-----------------end');
},
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final int item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
data.insert(newIndex, data.removeAt(oldIndex));
});
},
),
],
),
);
}
double _getPosition(int index) {
RenderBox box =
itemKeys[index].currentContext!.findRenderObject() as RenderBox;
Offset currentPosition =
box.localToGlobal(Offset.zero); //this is global position
double y = currentPosition.dy; //this is y - I think it's what you want
return y;
}
String formatTime(int timeStamp) {
return DateFormat('HH:mm aa')
.format(DateTime.fromMillisecondsSinceEpoch(timeStamp));
}
}