首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在StatefulWidget外部调用setState (使用设置器)

在StatefulWidget外部调用setState (使用设置器)
EN

Stack Overflow用户
提问于 2020-12-11 07:46:41
回答 1查看 286关注 0票数 0

我有很多使用Javascript的经验,现在我想从Flutter开始。因此,也许我的问题是,我将代码视为JS开发人员,而Flutter解决方案将有所不同。但这是我的问题:我想创建一个简单的纸牌游戏。扑克牌是一张StatefulWidget:

代码语言:javascript
运行
AI代码解释
复制
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更改图像:

代码语言:javascript
运行
AI代码解释
复制
GameCard spadeFour = GameCard(value: 4, suit: 'spade', visible: false),
spadeFour.setVisible(true)

我该怎么做呢?我读过关于Globalkey和其他东西,但它不可能那么复杂,因为这是一个非常常见的用例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-11 08:12:32

通常,您应该避免实例化小部件,然后通过属性修改它。这也是不必要的,因为您已经正确地使用了参数来更改小部件的外观。

要使用不同的参数重绘小部件,而不是在该小部件中调用setState,请在父小部件中调用它。

代码语言:javascript
运行
AI代码解释
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65247534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档