web-dev-qa-db-ja.com

Flutter-List.map()から反復インデックスを取得します

私は答えをネットでたくさん検索しました。

私は文字のリストにイテレーションを書いて、「マップ」クラスを使用してカードを画面に表示しました

コードでは、行を作成し、「マップ」を使用してすべてのuserBoardをカードに画面に印刷しました。内部にロジックを追加したいので、要素のIDを取得する必要があります(テーピングイベント用)。私はそれを行う方法がありますか?

実際には、userBoard上の要素の特定のインデックスを取得したい

コード:

Widget build(BuildContext context) {
return Row(
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: <Widget>[
        Row(
          children: userBoard
              .map((element) => Stack(children: <Widget>[
                    Align(
                      alignment: Alignment(0, -0.6),
                      child: GestureDetector(
                        onTap: (() {
                          setState(() {
                            // print("element=${element.toString()}");
                            // print("element=${userBoard[element]}");
                          });
                        }),
                        child: SizedBox(
                          width: 40,
                          height: 60,
                          child: Card(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(5.0),
                              ),
                              child: Center(
                                child: Text(element,
                                    style: TextStyle(fontSize: 30)),
                              )),
                        ),
                      ),
                    )
                  ]))
              .toList(),
        )
      ],
    ),

}

Picture-各カードはマップの「要素」です。onTap関数のインデックスを取得します。

ありがとうございました。

17
Shoham yetzhak

インデックスにアクセスするには、 asMap 演算子を使用してリストをマップに変換する必要があります。

final fruitList = ['Apple', 'orange', 'mango'];
final fruitMap = myList.asMap(); // {0: 'Apple', 1: 'orange', 2: 'mango'}

// To access 'orange' use the index 1.
final myFruit = fruitMap[1] // 'orange'

// To convert back to list
fruit fruitListAgain = fruitMap.values.toList();

あなたのコード

userBoard.asMap().map((i, element) => MapEntry(i, Stack(
  GestureDetector(onTap: () {
    setState(() {
      // print("element=${element.toString()}");
      // print("element=${userBoard[i].toString()}");
    });
  }),
))).values.toList();
39
Amsakanna

インデックスを取得できますlist.indexOfリストに重複する要素がない場合。

userBoard.map((element) {
  // get index
  var index = userBoard.indexOf(element);
  return Container(

  );
}).toList()
7
FireHsia

List.generateを使用した別のアプローチ:

var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));
3
EricW

新しい関数でIterableを拡張できます:

import 'Dart:core';

extension IndexedIterable<E> on Iterable<E> {
  Iterable<T> mapIndexed<T>(T f(E e, int i)) {
    var i = 0;
    return this.map((e) => f(e, i++));
  }
}

使用法:

myList.mapIndexed((element, index) {});

here から取得。

このアプローチには、Dart 2.7以降が必要です。

1
Andrey Gordeev

list.asMap()を使用できます

var result = list.asMap().map((e) => '${e[0]} - ${e[1]});
print(result);

https://api.dartlang.org/stable/2.2.0/Dart-core/List/asMap.html

1

package:quiverenumerate関数 最初:

enumerate(userBoard).map((indexedValue) {
  final index = indexedValue.index;
  final element = indexedValue.value;
  // ...
})
0
jamesdlin

反復インデックスを取得するための組み込み関数はありません。

おそらくあなたが望むのは、あなたにインデックスを与えるmapです:

children: enumerate(
  list,
  (index, item) => Text("event_$index")
).toList();

enumerateの実装は簡単です:

Iterable<E> enumerate<E, T>(
    Iterable<T> items, E Function(int index, T item) f) {
  var index = 0;
  return items.map((item) {
    final result = f(index, item);
    index = index + 1;
    return result;
  });
}
0
Vivien

別の解決策は、オブジェクトのhascodeがintとして一意であることを取得することですexample:

yourClass.hasCode()

これは、反復ごとに123456789のようなIDを返します

あなたが必要なときに別のウィジェットで使用するとき

onSelectChanged: (d) {
    setState(() {
       selectedRow = d == true ? object.hascode : null;
    });
 },
 selected: object.hascode == selectedRow,
0