使用以下Switch
小部件时,isOn
值始终返回true
,并且从不更改。
Switch
也仅在滑动上移动位置,轻按不会移动它。如何解决?
bool isInstructionView = false;
Switch(
value: isInstructionView,
onChanged: (bool isOn) {
setState(() {
isInstructionView = isOn;
print(isInstructionView);
});
},
activeColor: Colors.blue,
inactiveTrackColor: Colors.grey,
inactiveThumbColor: Colors.grey,
)
更新:为了更加清楚,onChanged
始终将isOn
作为true
返回。为什么会这样?
答案 0 :(得分:3)
这是我的切换按钮代码
B
答案 1 :(得分:2)
您只需要确保在Widget构建外部声明开关切换的布尔值即可使其全局且可用于SetState方法。无需初始化等。
class ExampleClass extends StatefulWidget {
@override
_ExampleClassState createState() => _ExampleClassState();
}
class _ExampleClassState extends State<ExampleClass> {
bool isInstructionView = false;
@override
Widget build(BuildContext context) {
return Container(
child: Switch(
value: isInstructionView,
onChanged: (isOn) {
setState(() {
isInstructionView = isOn
});
print(isInstructionView);
},
...
),
);
}
}
答案 2 :(得分:1)
class Tab_b extends StatefulWidget {
bool isInstructionView = false;
@override
State<StatefulWidget> createState() => new _TabsPageState();
}
class _TabsPageState extends State<Tab_b>{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("add data"),
),
body: new Container(
child: Switch(
value: widget.isInstructionView,
onChanged: (bool isOn) {
print(isOn);
setState(() {
widget.isInstructionView = isOn;
print(widget.isInstructionView);
});
},
activeColor: Colors.blue,
inactiveTrackColor: Colors.grey,
inactiveThumbColor: Colors.grey,
),
),
);
}
答案 3 :(得分:1)
我根据@Zulfiqar的答案添加了其他代码块。我没有测试此代码,但我在项目中使用了类似的代码。如果要保存它并在另一个类中使用,或者要在每次加载时显示最新状态,则可以将状态保存在全局变量中,并在加载类时调用它。希望对您有帮助。
class Tab_b extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _TabsPageState();
}
class _TabsPageState extends State<Tab_b>{
bool isInstructionView;
@override
void initState() {
isInstructionView = Global.shared.isInstructionView;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("add data"),
),
body: new Container(
child: Switch(
value: isInstructionView,
onChanged: (bool isOn) {
print(isOn);
setState(() {
isInstructionView = isOn;
Global.shared.isInstructionView = isOn;
isOn =!isOn;
print(isInstructionView);
});
},
activeColor: Colors.blue,
inactiveTrackColor: Colors.grey,
inactiveThumbColor: Colors.grey,
),
),
);
}
}
class Global{
static final shared =Global();
bool isInstructionView = false;
}
答案 4 :(得分:0)
状态更改时,您需要重新构建窗口小部件。请参阅文档 https://docs.flutter.io/flutter/material/Switch/onChanged.html
答案 5 :(得分:0)
在实施CupertinoSwitch时,我也遇到了同样的问题。我能够将其打开,但无法将其关闭。
根据this的示例,我试图将Switch放入名为“语义”的小部件中,并神奇地开始工作。
下面是代码:
body: Column(
children: <Widget>[
SizedBox(height: 50.0,),
Semantics(
container: true,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
CupertinoSwitch(
value: _switchValue,
onChanged: (bool value){
setState(() {
_switchValue = value;
_animating = value;
});
},
),
Text(
"${_switchValue ? "On" : "Off"}",
style: TextStyle(fontSize: 20.0,
fontWeight: FontWeight.bold),
),
],
),
),
SizedBox(
height: 50.0,
),
Visibility(
child: CupertinoActivityIndicator(
animating: _animating,
radius: 30.0,
),
visible: _animating,
),
],
),
希望有帮助。
答案 6 :(得分:0)
为了让 Switch 工作,move the setState(() {}) outside of Switch in a callback function
.
// Switch Widget
Switch( value: _toggleState,
onChanged: _attemptChange,
),
//Callback
void _attemptChange(bool newState) {
setState(() {
_toggleState = newState;
newState ? _switchCase = 'ON' : _switchCase = 'OFF';
});