Flutter 我能';当按下按钮时,不要让按钮切换值
简介:一段时间以来,我一直试图在按下芯片时切换颜色,但没有成功。如果有人能告诉我我在代码中做错了什么,那将是对我的极大帮助 期望值:我希望切换方法切换“isSelected”布尔值。按下芯片时的值。当我按下按钮时,绝对不会发生任何事情。我看到这个值确实从true变为false,但它并没有像预期的那样改变我的颜色,而且在第一次按下后它也不会再次改变值 代码:Flutter 我能';当按下按钮时,不要让按钮切换值,flutter,switch-statement,Flutter,Switch Statement,简介:一段时间以来,我一直试图在按下芯片时切换颜色,但没有成功。如果有人能告诉我我在代码中做错了什么,那将是对我的极大帮助 期望值:我希望切换方法切换“isSelected”布尔值。按下芯片时的值。当我按下按钮时,绝对不会发生任何事情。我看到这个值确实从true变为false,但它并没有像预期的那样改变我的颜色,而且在第一次按下后它也不会再次改变值 代码: import 'package:flutter/material.dart'; void main() => runApp(MyAp
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.deepPurple,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
List<Actions> actions = Actions.all();
List<Widget> newWidgets = [];
for (var i in actions) {
newWidgets.add(myChips(
isSelected: i.isSelected,
chipName: i.name,
function: () {
setState(() {
i.toggle();
print(i.isSelected);
});
}));
}
return Scaffold(
appBar: AppBar(
title: Text('Them'),
),
body: Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: Text('Test'),
pinned: true,
expandedHeight: 400.0,
flexibleSpace: FlexibleSpaceBar(
background: Image.asset('assets/abc.png'),
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => Container(
child: Column(
children: <Widget>[
Column(
children: <Widget>[
Container(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Name of Chips',
style: TextStyle(
color: Colors.black,
fontSize: 24.0,
fontWeight: FontWeight.bold,
),
),
),
),
Wrap(
direction: Axis.horizontal,
spacing: 10.0,
runSpacing: 5.0,
children: newWidgets,
),
categoryDivider(context),
],
)
],
),
),
childCount: 1,
),
),
],
),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
Container myChips({bool isSelected, String chipName, Function function}) {
return Container(
child: RaisedButton(
color: isSelected ? Color(0xffeadffd) : Color(0xffededed),
child: Text(
chipName,
style: TextStyle(
color: new Color(0xff6200ee),
),
),
onPressed: function,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0))),
);
}
}
// divider
Container categoryDivider(BuildContext context) {
return Container(
height: 1.0,
width: MediaQuery.of(context).size.width,
color: Colors.grey,
margin: const EdgeInsets.only(left: 10.0, right: 10.0),
);
}
class Actions {
Actions({this.name});
String name;
bool isSelected = false;
toggle() {
isSelected = !isSelected;
print(isSelected);
}
static List<Actions> all() {
return [
Actions(name: 'A'),
Actions(name: 'B'),
Actions(name: 'C'),
Actions(name: 'D'),
Actions(name: 'E'),
Actions(name: 'F'),
Actions(name: 'G'),
Actions(name: 'H'),
Actions(name: 'I'),
Actions(name: 'J'),
Actions(name: 'K'),
Actions(name: 'L'),
];
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
原色样本:颜色。深紫色,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
List actions=actions.all();
列出newWidgets=[];
用于(行动中的var i){
添加(我的芯片)(
我当选了,
芯片名:i.name,
功能:(){
设置状态(){
i、 切换();
印刷品(i.已选定);
});
}));
}
返回脚手架(
appBar:appBar(
标题:文本(“它们”),
),
主体:脚手架(
正文:自定义滚动视图(
条子:[
滑杆(
标题:文本(“测试”),
对,,
扩展高度:400.0,
flexibleSpace:FlexibleSpaceBar(
背景:Image.asset('assets/abc.png'),
),
),
银表(
代表:SliverChildBuilderDelegate(
(上下文,索引)=>容器(
子:列(
儿童:[
纵队(
儿童:[
容器(
孩子:填充(
填充:常数边集全部(16.0),
子:文本(
“芯片名称”,
样式:TextStyle(
颜色:颜色,黑色,
字体大小:24.0,
fontWeight:fontWeight.bold,
),
),
),
),
包裹(
方向:水平轴,
间距:10.0,
运行间距:5.0,
孩子们:newWidgets,
),
类别划分器(上下文),
],
)
],
),
),
儿童人数:1,
),
),
],
),
),//此尾随逗号使生成方法的自动格式设置更方便。
);
}
容器myChips({bool isSelected,字符串chipName,函数}){
返回容器(
孩子:升起按钮(
颜色:isSelected?颜色(0xffeadffd):颜色(0xFFEDED),
子:文本(
芯片名,
样式:TextStyle(
颜色:新颜色(0xff6200ee),
),
),
onPressed:函数,
形状:圆形矩形边框(
边界半径:边界半径。圆形(30.0)),
);
}
}
//分隔器
容器categoryDivider(构建上下文){
返回容器(
高度:1.0,
宽度:MediaQuery.of(context).size.width,
颜色:颜色。灰色,
边距:仅限常量边集(左:10.0,右:10.0),
);
}
集体诉讼{
操作({this.name});
字符串名;
bool-isSelected=false;
切换(){
isSelected=!isSelected;
印刷品(已选出);
}
静态列表所有(){
返回[
动作(名称:“A”),
操作(名称:“B”),
动作(名称:“C”),
操作(名称:“D”),
动作(名称:“E”),
动作(名称:“F”),
动作(名称:“G”),
动作(名称:“H”),
动作(名称:“I”),
动作(名称:“J”),
操作(名称:“K”),
动作(名称:“L”),
];
}
}
你做错了什么
每次调用all()
时,您都会返回一个新列表,因此每个操作都被重新初始化为未单击,并且每次调用setState()
时都会发生这种情况,因此您创建的新操作不会每次单击
解决方案:只定义一次列表,并为其创建一个getter
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
List<Actions> actions = Actions.all;
List<Widget> newWidgets = [];
for (var i in actions) {
newWidgets.add(myChips(
isSelected: i.isSelected,
chipName: i.name,
function: () {
setState(() {
i.toggle();
print(i.isSelected);
});
}));
}
return Scaffold(
appBar: AppBar(
title: Text('Them'),
),
body: Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: Text('Test'),
pinned: true,
expandedHeight: 400.0,
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => Container(
child: Column(
children: <Widget>[
Column(
children: <Widget>[
Container(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Name of Chips',
style: TextStyle(
color: Colors.black,
fontSize: 24.0,
fontWeight: FontWeight.bold,
),
),
),
),
Wrap(
direction: Axis.horizontal,
spacing: 10.0,
runSpacing: 5.0,
children: newWidgets,
),
categoryDivider(context),
],
)
],
),
),
childCount: 1,
),
),
],
),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
Container myChips({bool isSelected, String chipName, Function function}) {
return Container(
child: RaisedButton(
color: isSelected ? Color(0xffeadffd) : Color(0xffededed),
child: Text(
chipName,
style: TextStyle(
color: new Color(0xff6200ee),
),
),
onPressed: function,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0))),
);
}
}
// divider
Container categoryDivider(BuildContext context) {
return Container(
height: 1.0,
width: MediaQuery.of(context).size.width,
color: Colors.grey,
margin: const EdgeInsets.only(left: 10.0, right: 10.0),
);
}
class Actions {
Actions({this.name});
String name;
bool isSelected = false;
toggle() {
isSelected = !isSelected;
print(isSelected);
}
static List<Actions> _all =
[
Actions(name: 'A'),
Actions(name: 'B'),
Actions(name: 'C'),
Actions(name: 'D'),
Actions(name: 'E'),
Actions(name: 'F'),
Actions(name: 'G'),
Actions(name: 'H'),
Actions(name: 'I'),
Actions(name: 'J'),
Actions(name: 'K'),
Actions(name: 'L'),
];
static get all => _all;
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
列出操作=操作.all;
列出newWidgets=[];
用于(行动中的var i){
添加(我的芯片)(
我当选了,
芯片名:i.name,
功能:(){
设置状态(){
i、 切换();
印刷品(i.已选定);
});
}));
}
返回脚手架(
appBar:appBar(
标题:文本(“它们”),
),
主体:脚手架(
正文:自定义滚动视图(
条子:[
滑杆(
标题:文本(“测试”),
对,,
扩展高度:400.0,
),
银表(
代表:SliverChildBuilderDelegate(
(上下文,索引)=>容器(