微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter State 不会更新

如何解决Flutter State 不会更新

我正在尝试创建卡片的列表视图,仅当卡片被选中时,其图像才会显示在列表视图中。选择小部件是 PopupSubscription(),我通过将特定图像的 bool 设置为 true 来选择要显示哪些卡片 (SubscriptionCard)。但是当应用选择时,即使在执行 setState() 之后,所选图像也不会立即出现。 但是,当我切换选项卡并再次返回屏幕时,它们确实会出现。我应该怎么做才能更改不在当前状态类中的对象的状态?我尝试使用 Provider,但它让我对我应该做什么感到困惑。

这是在点击它时设置布尔值的订阅卡:

return InkWell(
  radius: 1.0,borderRadius: BorderRadius.circular(8.0),highlightColor: buttonBackground,onTap: () {
    setState(() {
      widget.currentSubscription.selected = !widget.currentSubscription.selected;
    });
  },child: Card(
    elevation: 1.0,borderOnForeground: true,shape: widget.currentSubscription.selected ? RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(3.0),side: BorderSide(color: buttonBackground,width: 2.0),) : ContinuousRectangleBorder(),color: bgDarkColor,child: SizedBox(
      width: SizeConfig.blockSizeHorizontal * 30,child: Stack(
        alignment: Alignment.topRight,children: [
          Row(
            mainAxisSize: MainAxisSize.max,children: [
              Image.asset(this.widget.currentSubscription.logo,height: 35.0,),Text(
                '  ${this.widget.currentSubscription.name}',style: TextStyle(fontFamily: 'Muli',fontSize: 16.0)
              ),],widget.currentSubscription.selected ? Container(
            decoration: Boxdecoration(
              shape: BoxShape.circle,color: buttonBackground,child: Padding(
              padding: const EdgeInsets.all(2.0),child: Icon(
                Icons.check,size: 10.0,color: Colors.white,) : Container()
        ],);

这是呈现所选卡片图像的 ListView:

Container(
      height: 50,width: 350,child: ListView(
        scrollDirection: Axis.horizontal,children: [
          IconButton(
            onpressed: () {
              showDialog(
                context: context,builder: (BuildContext context) {
                  return PopupSubscription();
                }
              );
            },icon: Icon(Icons.add_Box_rounded,size: 30.0,StatefulBuilder(
            builder: (context,setState) {
              return ListView.builder(
                scrollDirection: Axis.horizontal,shrinkWrap: true,itemCount: subscriptionsList.length,itemBuilder: (context,index) {
                  return Container(
                    margin: EdgeInsets.symmetric(horizontal: 5.0),child: ClipRRect(
                      borderRadius: BorderRadius.circular(25.0),child: Image.asset(
                        subscriptionsList[index].selected ? subscriptionsList[index].logo
                        : "assets/elements/streaming-services/netflix.jpeg",);
                },);
            }
          ),)
    ),

解决方法

根据您当前的代码,我猜您已在实际 currentSubscription 上方的 final 中将 StatefulWidget 变量添加为 State,例如:>

class MyClass extends StatefulWidget{
    final currentSubscription;
    // Rest of the code
}
class _MyClassState extends State<MyClass> {
    // Your ListView Code and other stuff.
}

当您想更改 onTap 状态时,这将不起作用,我建议您在 setState 类中的 _MyClassState 中使用变量,并在其中使用 setState。类似的东西:

class _MyClassState extends State<MyClass> {
    bool _isSelected = false; 

    // And in your onTap method,something like:
    setState(() {
      _isSelected = !_isSelected;
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。