尝试在 flutter 中创建一个没有 DRY 的 switchListTile

Sta*_*ang 4 layout android ios dart flutter

我对 flutter 完全陌生,我正在尝试制作一个一周中每天有 7 个开关的应用程序。

当创建 7 个不同的 switchlisttile 并且每个 switchlisttile 具有不同的值时,问题就解决了。

但是当我提取该方法时,开关不起作用。

这是下面的代码:

Column(
  children: <Widget>[
    buildSwitchListTile(Title : "Monday" , Value : Value1),
    buildSwitchListTile(Title : "Tuesday" , Value : Value2),
    buildSwitchListTile(Title : "Wednesday" , Value :  Value3),
    buildSwitchListTile(Title : "Thursday" , Value : Value4),
    buildSwitchListTile(Title : "Friday" , Value : Value5),
    buildSwitchListTile(Title : "Saturday" , Value : Value6),
    buildSwitchListTile(Title : "Sunday" , Value : Value7),
  ],
),
Run Code Online (Sandbox Code Playgroud)

提取方法:

SwitchListTile buildSwitchListTile({String Title , bool Value}) {
  return SwitchListTile(
    title: Text(Title),
    value: Value1,
    onChanged: (bool value) => setState(() {
      Value1 = value;
    }),
  );
}
Run Code Online (Sandbox Code Playgroud)

不过我知道我在上面的方法中使用了 Value1,原因是没有它开关就不起作用。

Abi*_*n47 5

问题是您传递给方法的变量与方法接收的Value1变量不同。Value它们具有相同的值,但如果您重新为 赋值Value,则不会影响 的值Value1。您可以像现在一样进行硬编码Value1,但这意味着您需要为每个value变量提供一个方法,这不是很干燥。

相反,请传递一个回调方法,以便buildSwitchListTile在点击图块时调用。这样,当您在build方法中调用该方法时,您可以指定每个变量将更改的变量。之后,程序应该可以正常运行。

SwitchListTile buildSwitchListTile({
  String Title, 
  bool Value,
  void Function(bool) onChanged,
}) {
  return SwitchListTile(
    title: Text(Title),
    value: Value,
    onChanged: onChanged,
 );
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

Column(
  children: <Widget>[
    buildSwitchListTile(Title: "Monday", Value: Value1, 
      onChanged: (val) => setState(() => Value1 = val)),
    buildSwitchListTile(Title: "Tuesday", Value: Value2, 
      onChanged: (val) => setState(() => Value2 = val)),
    buildSwitchListTile(Title: "Wednesday", Value:  Value3, 
      onChanged: (val) => setState(() => Value3 = val)),
    buildSwitchListTile(Title: "Thursday", Value: Value4, 
      onChanged: (val) => setState(() => Value4 = val)),
    buildSwitchListTile(Title: "Friday", Value: Value5, 
      onChanged: (val) => setState(() => Value5 = val)),
    buildSwitchListTile(Title: "Saturday", Value: Value6, 
      onChanged: (val) => setState(() => Value6 = val)),
    buildSwitchListTile(Title: "Sunday", Value: Value7, 
      onChanged: (val) => setState(() => Value7 = val)),
  ],
),
Run Code Online (Sandbox Code Playgroud)