我正在尝试创建一个类似列表视图的列表视图,我得到的东西还不错,但它不像运球时那么流畅。
我猜这是因为我调用 setState 的次数太多,并且它在动画期间更新了树,但我不知道如何使它更平滑,也许只调用一次 setState。我正在使用继承的小部件通过我的树传递我的状态,这是我的编辑状态的定义
void onChangeIndex (int newIndex) {
fadeText(_index, newIndex);
changePosition(newIndex);
}
void fadeText(int oldIndex,int newIndex) async {
setState(() {
_visible[oldIndex] = !_visible[oldIndex];
});
await Future.delayed(Duration(milliseconds: 300));
setState(() {
_visible[newIndex] = !_visible[newIndex];
debugPrint(_visible[oldIndex].toString());
});
}
void changePosition(newIndex) async {
await Future.delayed(Duration(milliseconds: 50));
setState(() {
_index = newIndex;
_scrollController.animateTo((_index)*320.0, duration: Duration(milliseconds: 800), curve: Curves.fastOutSlowIn);
});
}
这部分在我拖动列表视图时被调用,它的工作是滚动列表视图并为我的文本设置动画
这是我的列表视图中包含的卡片,如果结构混乱,我很抱歉,我对扑腾还很陌生。
GestureDetector(
child: Padding(
padding: EdgeInsets.all(6.0),
child: Card(
elevation: 0.0,
color: Colors.transparent,
child: Container(
width: 295.0,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children:<Widget>[
Expanded(
child:
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15.0)),
),
elevation: 5.0,
child: ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: Image.asset('images/paris.jpg', fit: BoxFit.contain),
),
)
),
]
),
Row(
children: <Widget>[
Expanded(
child: AnimatedOpacity(
opacity: StateManager.of(context).visible[widget.index] ? 1.0 : 0.0,
duration: Duration(milliseconds: 300),
child: Container(
height: 24.0,
child: Padding(
padding: const EdgeInsets.only(
left: 8.0
),
child: Text(
"Paris, France",
style: TextStyle(
color: Color.fromRGBO(0,0,0,0.9),
fontSize: 24.0,
fontWeight: FontWeight.bold,
),
),
)
)
)
),
],
),
Row(
children: <Widget>[
Expanded(
child: AnimatedOpacity(
opacity: StateManager.of(context).visible[widget.index] ? 1.0 : 0.0,
duration: Duration(milliseconds: 300),
child: Container(
height: 30.0,
child: Padding(
padding: const EdgeInsets.only(
left: 8.0
),
child: Text(
"Visiter ou bien aller au travail à vélo facilement grâce aux nombreux parkings à vélo présent dans cette ville.",
style: TextStyle(
color: Color.fromRGBO(0,0,0,0.7),
fontSize: 12.0,
fontWeight: FontWeight.bold,
),
),
)
)
)
),
],
),
])),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.all(Radius.circular(15.0)),
// ),
),
),
onHorizontalDragEnd: (details) {
var cardIndex = StateManager.of(context).index;
if(details.velocity.pixelsPerSecond.dx > 0) {
if(cardIndex>0) {
StateManager.of(context).onChangeIndex(cardIndex-1);
}
}else if(details.velocity.pixelsPerSecond.dx < 0){
if(cardIndex<2) {
StateManager.of(context).onChangeIndex(cardIndex+1);
}
}
},
);
如果您知道如何改进设置状态以使动画更流畅的方式,那将对我有很大帮助。