私は答えをネットでたくさん検索しました。
私は文字のリストにイテレーションを書いて、「マップ」クラスを使用してカードを画面に表示しました
コードでは、行を作成し、「マップ」を使用してすべての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関数のインデックスを取得します。
ありがとうございました。
インデックスにアクセスするには、 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();
インデックスを取得できますlist.indexOf
リストに重複する要素がない場合。
例
userBoard.map((element) {
// get index
var index = userBoard.indexOf(element);
return Container(
);
}).toList()
List.generate
を使用した別のアプローチ:
var list = ['y', 'e', 's'];
var widgets = List.generate(list.length, (i) => Text(list[i]));
新しい関数で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以降が必要です。
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
package:quiver
のenumerate
関数 最初:
enumerate(userBoard).map((indexedValue) {
final index = indexedValue.index;
final element = indexedValue.value;
// ...
})
反復インデックスを取得するための組み込み関数はありません。
おそらくあなたが望むのは、あなたにインデックスを与える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;
});
}
別の解決策は、オブジェクトのhascodeがintとして一意であることを取得することですexample:
yourClass.hasCode()
これは、反復ごとに123456789のようなIDを返します
あなたが必要なときに別のウィジェットで使用するとき
onSelectChanged: (d) {
setState(() {
selectedRow = d == true ? object.hascode : null;
});
},
selected: object.hascode == selectedRow,