だから私はFlutterを学び始めており、マテリアルガイドラインのWebサイトで見られるようなマテリアルデザインのドラッグアンドドロップリストを使用したいと考えています。
私がこれまで試したすべてのライブラリは、それと比べてゴミのように見えます。私が行方不明になっているこのための良いライブラリやネイティブのフラッターウィジェットはありますか?
knopp/flutter_reorderable_list を確認してください。それはまさにそれを達成します。本当にスムーズで、パフォーマンスの問題もなく、数千のアイテムを処理できます。
ただし、通常のフラッターウィジェットのように実装は簡単ではありません。
それに苦労している場合は、flutter/ReorderableListView
sをknopp/ReorderableList
に移植するために作成したウィジェットを使用することをお勧めします。
このウィジェットを使用すると本当に使いやすくなりますが、同じ柔軟性は提供されず、children
List
で機能するため、元のウィジェットほどスケーラブルではありません。
ReorderableListSimpleのコード で、これは デモ です。
Flutter自体は(マテリアル) ReorderableListViewクラス を提供します。
ネイティブのフラッターウィジェットReorderableListView
を使用してそれを実現できます。これを行う例があります。
List<String> _list = ["Apple", "Ball", "Cat", "Dog", "Elephant"];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: ReorderableListView(
children: _list.map((item) => ListTile(key: Key("${item}"), title: Text("${item}"), trailing: Icon(Icons.menu),)).toList(),
onReorder: (int start, int current) {
// dragging from top to bottom
if (start < current) {
int end = current - 1;
String startItem = _list[start];
int i = 0;
int local = start;
do {
_list[local] = _list[++local];
i++;
} while (i < end - start);
_list[end] = startItem;
}
// dragging from bottom to top
else if (start > current) {
String startItem = _list[start];
for (int i = start; i > current; i--) {
_list[i] = _list[i - 1];
}
_list[current] = startItem;
}
setState(() {});
},
),
);
}
flutter_reorderable_list と dragable_flutter_list を試しましたが、どれも正常に動作しませんでした-ドラッグ中に不要なアーティファクトがいくつかありました。だから私は独自のソリューションを作ろうとしました:
ListView.builder(
itemBuilder: (context, index) => buildRow(index),
itemCount: trackList.length,
),
Widget buildRow(int index) {
final track = trackList[index];
ListTile tile = ListTile(
title: Text('${track.getName()}'),
);
Draggable draggable = LongPressDraggable<Track>(
data: track,
axis: Axis.vertical,
maxSimultaneousDrags: 1,
child: tile,
childWhenDragging: Opacity(
opacity: 0.5,
child: tile,
),
feedback: Material(
child: ConstrainedBox(
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width),
child: tile,
),
elevation: 4.0,
),
);
return DragTarget<Track>(
onWillAccept: (track) {
return trackList.indexOf(track) != index;
},
onAccept: (track) {
setState(() {
int currentIndex = trackList.indexOf(track);
trackList.remove(track);
trackList.insert(currentIndex > index ? index : index - 1, track);
});
},
builder: (BuildContext context, List<Track> candidateData,
List<dynamic> rejectedData) {
return Column(
children: <Widget>[
AnimatedSize(
duration: Duration(milliseconds: 100),
vsync: this,
child: candidateData.isEmpty
? Container()
: Opacity(
opacity: 0.0,
child: tile,
),
),
Card(
child: candidateData.isEmpty ? draggable : tile,
)
],
);
},
);
}
私は推測しますが、これは最善の解決策ではなく、さらに変更するかもしれませんが、今のところは非常にうまく機能します
Flutterチームは ReorderableListView ウィジェットを導入しました。
ReorderableListView(
children: <Widget>[
for (var item in appState.menuButtons)
Text('data')
],
)