万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    ドラッグ可能なリストReorderableListView

    ReorderableListView を使うとできる

    参考: www.youtube.com

      @override
      Widget build(BuildContext context, WidgetRef ref) {
        List<Widget> _widgets = Iterable<int>.generate(50)
            .map(
              (i) => ListTile(
                key: ValueKey(i),
                title: Row(
                  children: [
                    Text(
                      'Item $i',
                      style: const TextStyle(color: Colors.white),
                    ),
                    const Expanded(child: SizedBox()),
                    const Icon(Icons.reorder),
                  ],
                ),
                tileColor: i % 2 == 0 ? Colors.pinkAccent : Colors.purple,
              ),
            )
            .toList();
    
        return Scaffold(
          body: ReorderableListView(
            onReorder: (int oldIndex, int newIndex) {
              // riverpodとか使ってる人は注意!
              setState(() {
                 if (oldIndex < newIndex) {
                   newIndex -= 1;
                 }
                 final Widget widget = _widgets.removeAt(oldIndex);
                 _widgets.insert(newIndex, widget);
               });
            },
            padding: const EdgeInsets.symmetric(horizontal: 40),
            children: _widgets,
          ),
        );
      }

    セル全体でドラッグ可能になってしまう。

    ↓こんな感じにセル全体でドラッグ可能ではなく、アイコンだけにしたい場合がある

    1. ReorderableListViewbuildDefaultDragHandlesfalse
    2. ドラッグ対象のWidgetの親を ReorderableDragStartListener

    よってこうなる

      @override
      Widget build(BuildContext context, WidgetRef ref) {
        // リストのWidget
        List<Widget> _widgets = Iterable<int>.generate(50)
            .map(
              (i) => ListTile(
                key: ValueKey(i),
                title: Row(
                  children: [
                    Text(
                      'Item $i',
                      style: const TextStyle(color: Colors.white),
                    ),
                    const Expanded(child: SizedBox()),
                    // このようにReorderableDragStartListenerで囲む
                    ReorderableDragStartListener(
                      index: i,
                      child: const Icon(Icons.reorder),
                    )
                  ],
                ),
                tileColor: i % 2 == 0 ? Colors.pinkAccent : Colors.purple,
              ),
            )
            .toList();
    
        return Scaffold(
          body: ReorderableListView(
            // こいつはデフォルトはtrueだがOFFにするためにfalse
            buildDefaultDragHandles: false,
            onReorder: (int oldIndex, int newIndex) {
              // riverpodとか使ってる人は注意!
              setState(() {
                 if (oldIndex < newIndex) {
                   newIndex -= 1;
                 }
                 final Widget widget = _widgets.removeAt(oldIndex);
                 _widgets.insert(newIndex, widget);
               });
            },
            padding: const EdgeInsets.symmetric(horizontal: 40),
            children: _widgets,
          ),
        );
      }