我有很多使用Javascript的经验,现在我想从Flutter开始。因此,也许我的问题是,我将代码视为JS开发人员,而Flutter解决方案将有所不同。但这是我的问题:我想创建一个简单的纸牌游戏。扑克牌是一张StatefulWidget:
class GameCard extends StatefulWidget {
int _value;
String _suit;
bool _visible;
String _imagePath;
// void setVisible() {
// How to execute setState here??
// }
GameCard({int value, String suit, bool visible = false}) {
...
this._visible = visible;
this._value = value;
this._suit = suit;
}
@override
_GameCardState createState() => _GameCardState();
}
class _GameCardState extends State<GameCard> {
String getSuit() => widget._suit;
int getValue() => widget._value;
bool isVisible() => widget._visible;
@override
Widget build(BuildContext context) {
...
return ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Container(
width: width,
height: width * 1.5,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: AssetImage(widget._imagePath),
...
其思想是,当卡片不可见时,state类中的imagePath应该是卡片的图像。现在,我希望在我的StatefulWidget中有一个setVisible函数,它运行setState(),然后更新imagePath。在那之后,imagePath应该是一张扑克牌的图像,比如红心王。最后,我想在其他地方创建一个GameCard实例,并使用setter更改图像:
GameCard spadeFour = GameCard(value: 4, suit: 'spade', visible: false),
spadeFour.setVisible(true)
我该怎么做呢?我读过关于Globalkey和其他东西,但它不可能那么复杂,因为这是一个非常常见的用例。
发布于 2020-12-11 08:12:32
通常,您应该避免实例化小部件,然后通过属性修改它。这也是不必要的,因为您已经正确地使用了参数来更改小部件的外观。
要使用不同的参数重绘小部件,而不是在该小部件中调用setState,请在父小部件中调用它。
class _YourParentPageState extends State<YourParentPage> {
bool visible = false;
_changeVisibility(bool v) {
setState(() {
visible = v;
});
}
@override
Widget build(BuildContext context) {
return GameCard(value: 4, suit: 'spade', visible: visible);
}
}
调用_changeVisibility将使用更新后的可见参数重新绘制GameCard。
https://stackoverflow.com/questions/65247534
复制相似问题