Reputation: 2274
I am using AnimatedList
in my Flutter app. It is working, but the dismiss
-behavior is not smooth because the dismissed item changes to its above item while transitioning.
Here is a Screenvideo for a better understanding. Concentrate on the text, it always changes mid-transition to the text of the first item ("Hallo Das ist 1").
I followed this Tutorial where you can also test it on a CodePad where you can see the exact same behavior. This is not the desired animation... Does anyone know how I can fix this?
Here is how I dismiss the items:
_removeMemoryAtIndex(int index, Month currentMonth) {
listKey.currentState!.removeItem(
index,
(_, animation) => slideIt(
context,
currentMonth,
0,
CurvedAnimation(
parent: animation,
curve: Curves.easeIn,
reverseCurve: Curves.easeOut),
),
duration: Duration(
milliseconds: 500,
),
);
Provider.of<MemoryImageProvider>(context, listen: false)
.removeMemoryAt(index: index);
}
and my slideIt
- function for the animation:
Widget slideIt(
BuildContext context,
Month currentMonth,
int index,
animation,
) {
Memory memory = currentMonth.memories[index];
return SlideTransition(
position: Tween<Offset>(
begin: const Offset(-1, 0),
end: Offset(0, 0),
).animate(
CurvedAnimation(
parent: animation,
curve: Curves.easeIn,
reverseCurve: Curves.easeOut,
),
),
child: Column(
children: [
MemoryTile(
memory: memory,
monthName: currentMonth.name,
onTapped: () {
_removeMemoryAtIndex(index, currentMonth);
print('tap on ${memory.description}');
},
),
SizedBox(
height: scaleWidth(20),
),
],
),
);
}
If you need any more info just let know! Any help is appreciated. I hope this can be fixed somehow...
Upvotes: 3
Views: 1308
Reputation: 2274
stupid mistake... If you look at the _removeMemoryAtIndex
method I always passed 0
as index...
Upvotes: 0
Reputation: 63549
we can create a temp Model Data for that, this is how it will be work.
import 'package:flutter/material.dart';
class MemoryTile {
int index;
String name;
MemoryTile({
required this.index,
required this.name,
});
}
final items = List.generate(
10,
(index) => MemoryTile(
index: index,
name: "name $index",
),
);
class AnimLtest extends StatefulWidget {
AnimLtest({Key? key}) : super(key: key);
@override
_AnimLtestState createState() => _AnimLtestState();
}
class _AnimLtestState extends State<AnimLtest> {
final GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();
// Remove the selected item from the list model.
_removeMemoryAtIndex(int index, MemoryTile currentMonth) {
var tempMOnth = currentMonth;
listKey.currentState!.removeItem(
index,
(_, animation) => slideIt(
context,
tempMOnth,
CurvedAnimation(
parent: animation,
curve: Curves.easeIn,
reverseCurve: Curves.easeOut),
),
duration: Duration(
milliseconds: 500,
),
);
items.removeAt(index);
// setState(() {});
}
@override
Widget build(BuildContext context) {
return AnimatedList(
key: listKey,
initialItemCount: items.length,
itemBuilder: (context, index, animation) => Container(
child: InkWell(
onTap: () {
_removeMemoryAtIndex(index, items[index]);
},
child: slideIt(
context,
items[index],
animation,
),
),
),
);
}
Widget slideIt(
BuildContext context,
MemoryTile memory,
animation,
) {
return SlideTransition(
position: Tween<Offset>(
begin: const Offset(-1, 0),
end: Offset(0, 0),
).animate(
CurvedAnimation(
parent: animation,
curve: Curves.easeIn,
reverseCurve: Curves.easeOut,
),
),
child: Row(
children: [
CircleAvatar(
child: Text(memory.index.toString()),
),
Text("Name+> ${memory.name}")
],
),
);
}
}
Upvotes: 0