Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何缩短此场景中的重复代码_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 如何缩短此场景中的重复代码

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

我正在使用颤振,我正在制作一个appBar,以基于滑块定位自身。我提出了下面的代码,正如你所看到的,滑块代码是重复的。有没有办法缩短它

我需要自定义此滑块,并执行类似CustomSlider的操作(appBarPosistion.height/top/left);这样我的代码就不会重复了

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
    的不同属性
在dart pad中查看此代码,以了解此代码中的传递值问题。

结论:


我想说,在这种情况下,没有必要删除代码的重复,因为它实际上并不是重复所有内容,但如果您想这样做,请尝试我在上面的
\u buildSlider
方法中建议的方法。

appBarPosition.height
0.5的最大值?谢谢ASAD,我会尝试这种方法,如果我在实现它们时遇到任何困难,请告诉你。当然,期待着:)谢谢你,乔希。我已经落实了你的建议。我又有麻烦了,我不能移动滑块。当我从外面打电话时,滑块有一个状态,我可以移动滑块。现在我不能。您能帮我一下吗?在这种情况下,您应该在使用滑块更新任何值时调用
setState
。我认为现在发生的是,滑块正在更新值,但由于状态没有更新,滑块将仅停留在初始状态。换句话说,在
setPosition
回调中使用
setState
应该可以解决这个问题