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