flutter KeepAlive On无状态微件

flvtvl50  于 2023-02-25  发布在  Flutter
关注(0)|答案(1)|浏览(160)

我想在我的无状态小部件gridview上添加Keep alive,而mixindg不能在无状态小部件上使用,当我尝试添加Keep alive或AlwaysKeepAlive小部件时,它给出以下Assert:
应用父级数据时引发了以下Assert。:ParentDataWidget使用不当。
父数据小部件保持活动(保持活动:true)希望将KeepAliveParentDataMixin类型的ParentData应用于RenderObject,该RenderObject已设置为接受不兼容类型ParentData的ParentData。
通常,这意味着KeepAlive小部件有错误的祖先RenderObjectWidget。通常,KeepAlive小部件直接放置在SliverWithKeepAliveWidget小部件中。有问题的KeepAlive当前放置在语义小部件中。
任何帮助都将不胜感激
小部件构建(BuildContext上下文){响应初始化(上下文);return保持活动状态(保持活动状态:是的,孩子:Obx((){返回脚手架(appBar:应用程序栏(图标主题:图标主题数据(颜色:Colors.black),标题:文本(控制器.目录ID!=空?控制器.目录ID!.目录名称:“所有产品”,款式:文本样式(颜色:Colors.black)、)、背景颜色:颜色:白色,立面:0,操作:[可见性(子项:图标按钮(按下:(){控制器.显示或隐藏搜索小工具(真);},图标:图标(Icons.search)),可见:控制器.是搜索小部件.是假,)],),

// appBar: AppBar(
        //   title: Text(contorller.cateid != null
        //       ? contorller.cateid!.cateName
        //       : 'All products'),
        // ),
        body: contorller.isloading.value
            ? Center(
                child: CircularProgressIndicator(),
              )
            : Column(
                children: [
                  SizedBox(
                    height: Responsive.safeBlockVerticalWAB * 2,
                  ),
                  Expanded(
                    child: GridView.builder(
                      shrinkWrap: true,
                      primary: false,
                      // physics: const NeverScrollableScrollPhysics(),
                      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                          crossAxisCount: 2, childAspectRatio: .83
                          // childAspectRatio: MediaQuery.of(context).size.width /
                          //     (MediaQuery.of(context).size.height / 1.01),
                          ),
                      itemCount: contorller.productlisrt.length,
                      itemBuilder: (context, index) {
                        return GestureDetector(
                          onTap: () => Get.to(() => ItemDetails(
                              product: contorller.productlisrt[index])),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            mainAxisSize: MainAxisSize.min,
                            children: [
                              Stack(
                                children: [
                                  Container(
                                    margin: const EdgeInsets.symmetric(
                                        horizontal: 10),
                                    child: ClipRRect(
                                      borderRadius:
                                          BorderRadius.circular(8.0),
                                      child: Image.network(
                                        '$mainurl/${contorller.productlisrt[index].image}',
                                        fit: BoxFit.cover,
                                      ),
                                    ),
                                  ),
                                  Obx(() {
                                    return Positioned(
                                      right:
                                          -Responsive.safeBlockHorizontal *
                                              1,
                                      bottom:
                                          Responsive.safeBlockHorizontal,
                                      child: RawMaterialButton(
                                        onPressed: () {
                                          _favoriteController.toggle(
                                              contorller
                                                  .productlisrt[index]);
                                        },
                                        fillColor: Colors.white,
                                        shape: CircleBorder(),
                                        elevation: 4.0,
                                        child: Padding(
                                          padding: EdgeInsets.all(5),
                                          child: _favoriteController
                                                  .hasProduct(contorller
                                                      .productlisrt[index])
                                              ? Icon(
                                                  Icons
                                                      .favorite, // : Icons.favorite_border,
                                                  color: Colors.red,
                                                  size: 17,
                                                )
                                              : Icon(
                                                  Icons.favorite_border,
                                                  color: Colors.red,
                                                  size: 17,
                                                ),
                                        ),
                                      ),
                                    );
                                  })
                                ],
                              ),
                              Padding(
                                padding: const EdgeInsets.only(
                                    left: 10, top: 8.0),
                                child: Text(
                                  contorller.productlisrt[index].itemName,
                                  style: const TextStyle(
                                    fontSize: 12.0,
                                    fontWeight: FontWeight.w900,
                                  ),
                                ),
                              ),
                              Padding(
                                padding: const EdgeInsets.only(
                                    left: 20, top: 4.0),
                                child: Text(
                                  contorller.productlisrt[index].itemDesc,
                                  overflow: TextOverflow.ellipsis,
                                  style: const TextStyle(
                                      fontSize: 10.0,
                                      fontWeight: FontWeight.w400,
                                      color: Colors.grey),
                                  maxLines: 1,
                                ),
                              ),
                            ],
                          ),
                        );
                      },
                    ),
                  ),
                ],
              ));
  }),
);

}

fdbelqdn

fdbelqdn1#

可以肯定的是,问题在于您试图在无状态小部件上使用keepAlive
在无状态的小部件上没有“保持活动”的状态,因此它不会工作。但是,你应该能够在有状态的小部件上使用它。
那只是我的直觉!

相关问题