Dart 颤振-开关列表-干代码

Dart 颤振-开关列表-干代码,dart,flutter,Dart,Flutter,完全是新手,所以请容忍我。只是一个关于如何使用DRY原则重构代码的问题。我相信在这样一个简单的例子上是可以做到的,所以这里。。。。我下面的代码显示了三个“switchListTiles”。我已经设法解决了如何创建3个相互重叠的SwitchListTile,以及如何让它们单独打开/关闭。这意味着我要创建以下函数3次: bool _value3 = false; void _onChanged3(bool value3) { setState(() { _value3 = va

完全是新手,所以请容忍我。只是一个关于如何使用DRY原则重构代码的问题。我相信在这样一个简单的例子上是可以做到的,所以这里。。。。我下面的代码显示了三个“switchListTiles”。我已经设法解决了如何创建3个相互重叠的SwitchListTile,以及如何让它们单独打开/关闭。这意味着我要创建以下函数3次:

bool _value3 = false;

void _onChanged3(bool value3) {
    setState(() {
      _value3 = value3;
    });
  }
我确信有一种方法可以改变这一点,这样我就不会有三次相同的代码。 任何帮助都将不胜感激 非常感谢

    import 'package:flutter/material.dart';

    void main() {
      runApp(new MaterialApp(
        title: "Switch Widget Demo",
        home: new MyApp(),
      ));
    }

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }

    class _MyAppState extends State<MyApp> {

      bool _value = false;

      void _onChanged(bool value) {
        setState(() {
          _value = value;
        });
      }

      bool _value2 = false;

      void _onChanged2(bool value2) {
        setState(() {
          _value2 = value2;
        });
      }

      bool _value3 = false;

      void _onChanged3(bool value3) {
        setState(() {
          _value3 = value3;
        });
      }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Switch Demo"),
        backgroundColor: Colors.redAccent,
        centerTitle: true,
      ),
      body: Container(
        padding: EdgeInsets.all(32.0),
        child: Column(
          children: <Widget>[

            Switch(value: _value,
              onChanged: (bool value) {_onChanged(value);}),
            SwitchListTile(value: _value,
              title: Text("Click Me"),
              activeColor: Colors.red,
              secondary: Icon(Icons.home),
              subtitle: Text("For my small print"),
              onChanged: (bool value) {_onChanged(value);}),

            SwitchListTile(value: _value2,
                title: Text("Click Me Again Please"),
                activeColor: Colors.lightGreen,
                secondary: Icon(Icons.perm_identity),
                onChanged: (bool value2) {_onChanged2(value2);}),

            SwitchListTile(value: _value3,
                title: Text("And Again Please"),
                activeColor: Colors.blueGrey,
                subtitle: Text("Some more small print"),
                secondary: Icon(Icons.person),
                onChanged: (bool value) {_onChanged3(value);}),


          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(新材料)PP(
标题:“切换小部件演示”,
主页:新建MyApp(),
));
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
布尔值=假;
void _onChanged(布尔值){
设置状态(){
_价值=价值;
});
}
布尔值2=假;
更改后无效2(布尔值2){
设置状态(){
_value2=value2;
});
}
布尔值3=假;
变更后无效3(布尔值3){
设置状态(){
_value3=value3;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“开关演示”),
背景颜色:Colors.redAccent,
标题:对,
),
主体:容器(
填充:边缘设置。全部(32.0),
子:列(
儿童:[
开关(值:_值,
onChanged:(bool值){u onChanged(值);}),
SwitchListTile(值:_值,
标题:文本(“单击我”),
activeColor:Colors.red,
次要:图标(Icons.home),
字幕:文本(“我的小字体”),
onChanged:(bool值){u onChanged(值);}),
SwitchListTile(值:_值2,
标题:文本(“请再次单击我”),
activeColor:Colors.lightGreen,
次要:图标(图标、永久标识),
onChanged:(bool value2){{u onChanged2(value2);}),
SwitchListTile(值:_值3,
标题:文本(“请再说一遍”),
activeColor:Colors.bluegray,
字幕:文本(“一些小字体”),
次要:图标(Icons.person),
onChanged:(bool值){{u onChanged3(值);}),
],
),
),
);
}
}

您只需将
开关列表瓷砖
重构为其单独的类,然后在父窗口小部件中创建
列表

在这里,我用较少的代码创建了20个:

类mySwitchListTileContainer扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色。灰色[800],
正文:ListView(
子项:List.generate(20,(i)=>MySwitchListTile(
)),
),
);
}
}
类MySwitchListTile扩展StatefulWidget{
@凌驾
_MySwitchListTileState createState()=>新建_MySwitchListTileState();
}
类_MySwitchListTileState扩展状态{
bool _v=假;
@凌驾
小部件构建(构建上下文){
返回SwitchListTile(
值:_v,
一旦更改:(值)=>setState(){
_v=值;
}),
);
}
}

在您的_onChanged:_onChanged(布尔值,int-index)中添加一个索引怎么样?您还可以编写一个方法来创建SwitchListTile并调用它3次哇!谢谢你们的回复。还感谢代码更新Aziza。似乎我想要的唯一问题是如何对每个“SwitchListTile”(即不同的名称、字幕等)进行个性化???我还想到了另外一个问题,那就是如何为每一个指定一个不同的“onChanged”方法——再次感谢您的帮助我知道这是一个老问题,但是如果您仍然想知道,您可以为MySwitchListTile创建变量并通过构造函数传递它们。取决于您的需要,但您需要将这些值传递给_mySwitchListTileEstate类,并将其分配给相应的属性(例如,传递一个名为title的字符串,并将其分配给将在SwitchListTile属性内创建的文本小部件的字符串)。此外,我相信您可以使用一个ValueSetter传递给onChanged
class MySwitchListTilesContainer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[800],
      body: ListView(
        children: List.generate(20, (i)=>MySwitchListTile(

        )),
      ),
    );
  }
}
class MySwitchListTile extends StatefulWidget {

  @override
  _MySwitchListTileState createState() => new _MySwitchListTileState();
}

class _MySwitchListTileState extends State<MySwitchListTile> {
  bool _v = false;
  @override
  Widget build(BuildContext context) {
    return  SwitchListTile(
      value:_v,
      onChanged: (value)=>setState((){
        _v=value;
      }),

    );
  }
}