Flutter 如何缩短此场景中的重复代码
我正在使用颤振,我正在制作一个appBar,以基于滑块定位自身。我提出了下面的代码,正如你所看到的,滑块代码是重复的。有没有办法缩短它 我需要自定义此滑块,并执行类似CustomSlider的操作(appBarPosistion.height/top/left);这样我的代码就不会重复了Flutter 如何缩短此场景中的重复代码,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我正在使用颤振,我正在制作一个appBar,以基于滑块定位自身。我提出了下面的代码,正如你所看到的,滑块代码是重复的。有没有办法缩短它 我需要自定义此滑块,并执行类似CustomSlider的操作(appBarPosistion.height/top/left);这样我的代码就不会重复了 class NewWidget extends StatelessWidget { NewWidget(this.appBarPosistion); final AppBarPosistion app
class NewWidget extends StatelessWidget {
NewWidget(this.appBarPosistion);
final AppBarPosistion appBarPosistion;
@override
Widget build(BuildContext context) {
return Column(mainAxisAlignment: MainAxisAlignment.end, children: [
SizedBox(
height: 100,
),
Slider(
value: appBarPosistion.height,
min: 0,
max: 0.5,
divisions: 100,
label: "Height " + appBarPosistion.height.toString(),
onChanged: (value) => appBarPosistion.height = value,
),
Slider(
value: appBarPosistion.top,
min: 0,
max: 100,
divisions: 100,
label: "Top " + appBarPosistion.top.toString(),
onChanged: (value) => appBarPosistion.top = value),
Slider(
value: appBarPosistion.left,
min: 0,
max: 100,
divisions: 100,
label: "Left " + appBarPosistion.left.toString(),
onChanged: (value) => appBarPosistion.left = value),
// CustomSlider(appBarPosistion.left, appBarPosistion: null,),
]);
}
}
您可以使用
ListView.builder
和三元运算符来实现这一点
ListView.builder(
itemCount: 3,
itemBuilder: (context, index){
return Slider(
value: index == 0 ? appBarPosistion.height: index == 1 ? appBarPosistion.top : appBarPosistion.left,
min: 0,
max: 100,
divisions: 100,
label: index == 0 ? "Height " + appBarPosistion.height.toString() : index == 1 ? "Top" + appBarPosistion.top.toString(): "Left"+ appBarPosistion.left.toString(),
onChanged: (value) => index == 0 ? appBarPosition.height = value : index == 1 ? appBarPosition.top = value : appBarPosition.left = value,
);
}
)
如您所见,滑块代码是重复的。有没有办法缩短它
由于在appBarPosition
属性上执行的工作类型类似,因此代码似乎是重复的,但在我看来,每个滑块都需要像在代码中一样声明
最重要的是,即使我尝试在一个组件下组合公共逻辑,它仍然与现有代码相似
请查看以下内容:
Widget\u构建滑块({
double函数()getPosition,
无效函数(双新位置)设置位置,
双倍最大值,
字符串标签前缀,
}) {
返回滑块(
值:getPosition(),
分:0,,
马克斯:马克斯,
分区:100,
标签:“$labelPrefix${getPosition()}”,
一旦更改:(值)=>设置位置(值),
);
}
用法:
\u构建滑块(
getPosition:()=>appBarPosition.left,
设置位置:(值)=>appBarPosition.left,
最高:100,
标签前缀:“左”
),
_构建滑块(
getPosition:()=>appBarPosition.top,
setPosition:(值)=>appBarPosition.top,
最高:100,
标签前缀:“顶部”
)
正如您在上面的示例中所看到的,出于以下原因,我不得不使用传递getter和setter作为参数来更新appbarposition
的各个属性:
- 被操纵的每个属性都是前置类型(double),因此不能作为
,必须作为引用传递
值传递
- 每个滑块更新
的不同属性appBarPosition
我想说,在这种情况下,没有必要删除代码的重复,因为它实际上并不是重复所有内容,但如果您想这样做,请尝试我在上面的
\u buildSlider
方法中建议的方法。是appBarPosition.height
0.5的最大值?谢谢ASAD,我会尝试这种方法,如果我在实现它们时遇到任何困难,请告诉你。当然,期待着:)谢谢你,乔希。我已经落实了你的建议。我又有麻烦了,我不能移动滑块。当我从外面打电话时,滑块有一个状态,我可以移动滑块。现在我不能。您能帮我一下吗?在这种情况下,您应该在使用滑块更新任何值时调用setState
。我认为现在发生的是,滑块正在更新值,但由于状态没有更新,滑块将仅停留在初始状态。换句话说,在setPosition
回调中使用setState
应该可以解决这个问题