试图在颤动中创建一个没有 DRY 的 switchListTile

Trying to create a switchListTile without DRY in flutter

我完全不熟悉 flutter,我正在尝试制作一个应用程序,该应用程序在一周中的每一天都有 7 个开关。

当创建 7 个不同的 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),
  ],
),

提取方法:

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

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

您将 Value1 传递给 SwitchListTile 中的 value 参数。将其替换为 buildSwitchListTile 方法中的 value 参数。

您的 IDE 可能会告诉您从未使用过 Value 参数。

P.S。参数和变量使用 lowerCamelCase。学习并坚持 Dart 大写规则有助于每个人更好地理解您的代码。

问题是您传递给方法的 Value1 与方法接收的 Value 不是同一个变量。它们具有相同的值,但如果您将值重新分配给 Value,则不会影响 Value1 的值。您可以改为 hard-code Value1 就像您正在做的那样,但这意味着您需要为每个 value 变量提供一个方法,这不是很干。

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

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

并像这样使用它:

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)),
  ],
),