答案 0 :(得分:4)
我相信我已经设法在不使用49.189999
48.360001
的情况下做同样的事情。
根据我的理解,您试图在第一个问题中让RaisedButton
在两个案例之间切换,您可以通过在调用RaisedButton
时在两个States
之间切换来实现此目的。
但是,为了回答您的第二个问题,我使用的是onPressed
而不是Container
,此RaisedButton
现在充当Container
并且在点按时,它在状态之间切换。并且Button
会将自己的大小调整为Container
,child
在我的示例中具有更改状态Text
(String
和Color
值)
最后,为了使此Container
与RaisedButton
的新闻功能类似,我将其包裹在GestureDetector
内,并控制onTap
内的状态更改{1}}致电。
这是我的完整代码:
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
home: new MyApp()));
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
Color _myColor = Colors.green;
String _myAccountState = "Account Enabled";
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Manage Accounts"),
centerTitle: true,
),
body: new Center(
child: new GestureDetector(
child: new Container(
decoration: new BoxDecoration(color: Colors.grey),
child: new Text(
_myAccountState, style: new TextStyle(color: _myColor),),
),
onTap: () {
setState(() {
if (_myColor == Colors.green) {
_myAccountState = "Account Disabled";
_myColor = Colors.orange;
}
else {
_myAccountState = "Account Enabled";
_myColor = Colors.green;
}
});
},
)
),
);
}
}
PS:对于开关开关行为,您绝对可以使用RaisedButton
并产生类似的行为,如下所示:
return new Scaffold(
appBar: new AppBar(
title: new Text("Manage Accounts"),
centerTitle: true,
),
body: new Center(
child: new Column(
children: <Widget>[
new Text(_myAccountState),
new RaisedButton(
child: new Text("Click Me"), color: _myColor, onPressed: () {
setState(() {
if (_myColor == Colors.green) {
_myAccountState = "Account Disabled";
_myColor = Colors.red;
}
else {
_myAccountState = "Account Enabled";
_myColor = Colors.green;
}
});
})
],
),
),
);
但是,我尝试将Container
与GestureDetector
一起使用的唯一原因是回答您的第二个问题,我不确定如何将shrinkWrap与RaisedButton
一起使用。
答案 1 :(得分:0)
为了重现“ 2状态按钮”,我个人使用AnimatedCrossFade
在RaisedButton
和OutlineButton
之间切换。这样,状态可以直接在crossFadeState
小部件的AnimatedCrossFade
属性中处理。
这是一个小部件,您可以在任何需要的地方使用。设置宽度以避免不良的剪切效果。显示全文必须足够。由于它是一个无状态的小部件,因此,该小部件的用户负责更改状态。
class ToggleButton extends StatelessWidget {
final selected, onChange, textSelected, textUnselected, width;
ToggleButton({this.textSelected, this.textUnselected, this.selected, this.onChange, this.width = 150}) {}
@override
Widget build(BuildContext context) {
return AnimatedCrossFade(
duration: Duration(milliseconds: 200),
crossFadeState: selected ? CrossFadeState.showFirst : CrossFadeState.showSecond,
firstChild: Container(
width: width,
child: RaisedButton(
child: Text(textSelected),
onPressed: () {
onChange(false);
},
),
),
secondChild: Container(
width: width,
child: OutlineButton(
child: Text(textUnselected),
onPressed: () {
onChange(true);
},
),
),
);
}
}
您可以简单地使用此小部件:
ToggleButton(
textSelected: "Account enabled",
textUnselected: "Account disabled",
width: 150,
selected: _accountEnabled,
onChange: (value) {
setState(() {
_accountEnabled = value;
});
},
)