フラッターで発生している問題を表示するためのリストを作成しました。
リストアイテムボタンをクリックするたびに、その下のボタンが削除されます。下のgifからわかるように、ボタンをクリックすると、下部の要素の2番目のコピーが作成されます。
アニメーションの途中で一時停止すると、次のようになります。
AnimtedListを作成するために、私はそれにグローバルキーを与えることから始めました:
final GlobalKey<AnimatedListState> _ListKey = GlobalKey();
次に、次のような色のリストを作成します。
List<Color> listColors = [Colors.orange, Colors.green, Colors.red, Colors.blue, Colors.yellowAccent, Colors.brown,];
次に、次のようなAnimatedListがあります。これは、listColorsの長さの初期サイズと、_buildListItemの子を持ちます。
AnimatedList(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
key: _ListKey,
initialItemCount: listColors.length,
itemBuilder: (context, index, animation) {
return _buildListItem(index, animation);
},
),
これは、リストアイテムのビルドメソッドであり、List_Elementの子を持つSizeTransitionです。
SizeTransition _buildListItem(int index, Animation<double> animation,) {
return SizeTransition(
sizeFactor: animation,
child: List_Element(index),
);
}
これはList_Elementであり、色のリストのインデックスによって設定された色のシンプルなボタンが付いたリストの行です。onPressedメソッドで、removeFromListFunctionを呼び出して、下の行を削除します。
class List_Element extends StatefulWidget {
int listIndex;
List_Element(int listIndex) {
this.listIndex = listIndex;
}
@override
_List_ElementState createState() => _List_ElementState();
}
class _List_ElementState extends State<List_Element> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(4),
child: Container(
width: double.infinity,
height: 50,
child: RaisedButton(
color: listColors[widget.listIndex],
elevation: 2,
child: Center(child: Text("List item " + widget.listIndex.toString(), style: TextStyle(fontWeight: FontWeight.bold),),),
onPressed: (){
_removeFromList(widget.listIndex);
},
),
),
);
}
}
これはremoveFromList関数です。
void _removeFromList(int index) {
listColors.remove(int);
_ListKey.currentState.removeItem(index+1,
(BuildContext context, Animation<double> animation) {
return _buildListItem(index, animation);
});
}
それがアニメーションリストの問題なのか、それとも私の実装の問題なのかはわかりません。
ご協力いただきありがとうございます
void _removeFromList(int index) {
listColors.remove(int);
_ListKey.currentState.removeItem(index+1,
(BuildContext context, Animation<double> animation) {
//return _buildListItem(index, animation);
return _buildListItem(index + 1, animation);
});
}
私が間違っていなければ、これが起こっている理由は、「削除された」ボタンを再構築するときに「現在クリックされている」ボタンのインデックスを渡しているためです。したがって、クリックされたボタンが再び表示されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加