Flutter 控制同一类型的多个小部件,同时避免一个globalkey列表

Flutter 控制同一类型的多个小部件,同时避免一个globalkey列表,flutter,Flutter,我一直在使用自定义扩展磁贴小部件,以便能够以编程方式控制扩展: const Duration _kExpand=const Duration(毫秒:200); 类AppExpansionTile扩展StatefulWidget{ const AppExpansionTile({ 关键点, 这个,领导,, @需要这个标题, 这个背景色, 这个,一个扩展改变了, this.children:const[], 这个,拖尾,, this.initiallyExpanded:false, }) :asse

我一直在使用自定义扩展磁贴小部件,以便能够以编程方式控制扩展:

const Duration _kExpand=const Duration(毫秒:200);
类AppExpansionTile扩展StatefulWidget{
const AppExpansionTile({
关键点,
这个,领导,,
@需要这个标题,
这个背景色,
这个,一个扩展改变了,
this.children:const[],
这个,拖尾,,
this.initiallyExpanded:false,
})
:assert(initiallyExpanded!=null),
超级(键:键);
最终引导;
最终小部件标题;
最终价值因扩张而改变;
最后儿童名单;
最终颜色背景色;
最终窗口小部件跟踪;
最终bool初始扩展;
@凌驾
AppExpansionTileState createState()=>新建AppExpansionTileState();
}

类AppExpansionTileState扩展状态。谢谢@Simon。

我通过为
AppExpansionTile
创建一个控制器解决了这个问题:

类AppExpansionTileController扩展了ValueNotifier{
AppExpansionTileController(布尔值):超级(值);
void expand(){
值=真;
}
空洞塌陷(){
值=假;
}
void toggle(){
value=!value;
}
}
然后将此控制器添加到我的
AppExpansionTile

const Duration _kExpand=const Duration(毫秒:200);
类AppExpansionTile扩展StatefulWidget{
const AppExpansionTile({
关键点,
这个,领导,,
@需要这个标题,
这个背景色,
这个,一个扩展改变了,
this.children:const[],
这个,拖尾,,
this.expansionController//添加控制器
})
:assert(initiallyExpanded!=null),
超级(键:键);
最终引导;
最终小部件标题;
最终价值因扩张而改变;
最后儿童名单;
最终颜色背景色;
最终窗口小部件跟踪;
final AppExpansionTileController expansionController;//添加控制器
@凌驾
AppExpansionTileState createState()=>新建AppExpansionTileState();
}
类AppExpansionTileState使用SingleTickerProviderStateMixin扩展状态{
AnimationController _AnimationController;
曲线动画;
弯曲空气化(即无空气化);;
颜色之间的边界颜色;
彩色吐温(头色),;
彩色吐温(iconColor);;
背景色;
动画_iconTurns;
//添加控制器
AppExpansionTileController\u扩展控制器;
AppExpansionTileController获取\u effectiveController=>widget.controller???\u expansionController;
布尔(u)被扩张;;
@凌驾
void initState(){
super.initState();
_animationController=新的animationController(持续时间:_kExpand,vsync:this);
_easeOutAnimation=新曲线动画(父对象:_animationController,曲线:Curves.easeOut);
_easeInAnimation=新曲线动画(父对象:_animationController,曲线:Curves.easeIn);
_borderColor=新的ColorTween();
_headerColor=新的色差();
_iconColor=新的ColorTween();
_iconTurns=新的二者之间(开始:0.0,结束:0.5)。设置动画(_easeinimation);
_backgroundColor=新的ColorTween();
//如果没有传递任何控制器,则我们正在创建自己的控制器,其初始状态为折叠状态
如果(widget.controller==null)\u expansionController=AppExpansionTileController(false);
_isExpanded=\u effectiveController.value;
//侦听控制器的值以更改扩展状态。
_effectiveController.addListener(()=>_setExpanded(_effectiveController.value));
如果(_isExpanded)_animationController.value=1.0;
}
@凌驾
无效处置(){
_animationController.dispose();
super.dispose();
}
void expand(){
_设置扩展(真);
}
空洞塌陷(){
_设置扩展(假);
}
void toggle(){
_setExpanded(!\u isExpanded);
}
void _setExpanded(bool isExpanded){
如果(_isExpanded!=isExpanded){
设置状态(){
_isExpanded=isExpanded;
如果(_i扩展)
_animationController.forward();
其他的
_animationController.reverse()。然后((值){
设置状态(){
//在没有widget.children的情况下重建。
});
});
PageStorage.of(context)?.writeState(context,_isExpanded);
});
if(widget.onExpansionChanged!=null){
widget.onExpansionChanged(_isexpansed);
}
}
}
Widget\u buildChildren(BuildContext,Widget子对象){
最终颜色borderSideColor=\u borderColor.evaluate(\u easeOutAnimation)??Colors.transparent;
最终颜色标题颜色=_headerColor.evaluate(_easeinimation);
退回新货柜(
装饰:新盒子装饰(
颜色:_backgroundColor.evaluate(_easeOutAnimation)?Colors.transparent,
边界:新边界(
顶部:新BorderSide(颜色:borderSideColor),
底部:新BorderSide(颜色:borderSideColor),
)
),
子:新列(
mainAxisSize:mainAxisSize.min,
儿童:[
IconTheme.merge(
数据:新的IconThemeData(颜色:_iconColor.evaluate(_easeInAnimation)),
孩子:新的ListTile(
onTap:切换,
引导:widget.leading,
标题:新DefaultTextStyle(
风格:主题
.of(上下文)