Flutter 使用400多个小盒子优化可缩放网格

Flutter 使用400多个小盒子优化可缩放网格,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我创建了一些类似日历的东西,带有可点击的框,但由于框很多,Android上的性能很差(在iOS上没有这样的问题)。 我正在使用以下代码渲染整个过程: ClipRect( child: PhotoView.customChild( customSize: Size(gridWidth, constraints.maxHeight),

我创建了一些类似日历的东西,带有可点击的框,但由于框很多,Android上的性能很差(在iOS上没有这样的问题)。 我正在使用以下代码渲染整个过程:

ClipRect(
                          child: PhotoView.customChild(
                              customSize: Size(gridWidth, constraints.maxHeight),
                              child: GridView.builder(
                                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                                    crossAxisCount: 13,
                                    mainAxisSpacing: 1.0,
                                    crossAxisSpacing: 1.0,
                                    childAspectRatio: 1),
                                itemCount: gridCreationHelperClass.boxWidgets.length,
                                physics: ClampingScrollPhysics(),
                                padding: const EdgeInsets.all(4.0),
                                itemBuilder: (BuildContext context, int index) {
                                  return gridCreationHelperClass.boxWidgets[index];
                                },
                              ),
                              minScale: 1.0,
                              //initialScale: 5.0,
                              backgroundDecoration: BoxDecoration(
                                  color: Colors.transparent),
                              childSize: Size(gridWidth, constraints.maxHeight),
                              scaleChange: gridCreationHelperClass.scaleHasChanged,
                        )
这些BoxWidget可以是一个容器:

Container(
        alignment: AlignmentDirectional.center,
        color: color,
        child: Text(showTextInBox ? text : "", style: TextStyle(fontSize: textInBoxSize,color: Colors.white,
            fontFamily: getFontStatic(complexFont)), textAlign: TextAlign.center,)
或SVG:

Stack(children: <Widget>[
      new SvgPicture.asset(
        "images/squ.svg",
        color: color,

      ),
      Text(showTextInBox ? text : "", style: TextStyle(fontSize: textInBoxSize,color: Colors.white,
          fontFamily: getFontStatic(complexFont)), textAlign: TextAlign.center,)
    ],alignment: AlignmentDirectional.center)

谢谢你的帮助

从未使用过photo_视图库,但非常确定您必须以某种方式缓存视图

查看这篇关于优化绘图的帖子。。。它可能会起作用:


从未使用过照片视图库,但可以肯定的是,您必须以某种方式缓存视图

查看这篇关于优化绘图的帖子。。。它可能会起作用:


仅在我的OnePlus 5T上出现问题,它在任何其他android手机上运行都非常平稳(仅使用容器,而不是SVG),即使是我50美元的中文测试手机和我最初的Sony Xperia Z安卓果冻豆。 我想OnePlus很奇怪


此外,目前我正在抛弃整个GridView并构建一个CustomPainter,即使在我的OP 5T+CustomPainter上调试时,它也能以60 fps的速度进行缩放和滚动,这给了我很大的自由度,我不必担心将来的颤振变化。

好吧,它只在我的OnePlus 5T上有问题,运行非常平稳(仅使用容器,不使用SVG)在任何其他android手机上,即使是我50美元的中国测试手机和我最初的Sony Xperia Z安卓果冻豆。 我想OnePlus很奇怪


此外,目前我正在抛弃整个GridView并构建一个CustomPainter,即使在我的OP 5T+CustomPainter上调试时,它也能以60 fps的速度进行缩放和滚动,这给了我很大的自由度,而且我不必担心未来的颤振变化。

因此,我采取了一种迄今为止似乎性能良好的不同方法。没有真正的ne为此,我们建议您使用外部PhotoView依赖项。最好只在您的状态中添加一个
双刻度;
,然后使用Flatter的内置
手势检测器

GestureDetector(
  onScaleUpdate: (ScaleUpdateDetails scaleDetails) {
    setState(() {
      _scale = scaleDetails.horizontalScale;
    });
  },
  child: GridView.builder(
    gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: max(1, (16 / _scale).floor())),
    itemCount: _counter * 17,
    itemBuilder: (BuildContext context, int index) {
      return GridTile(
          child: SvgPicture.asset('assets/image.svg'));
    },
    padding: const EdgeInsets.all(4.0),
  ),
),

看看这张照片,它看起来真的是面向可缩放/可平移的照片-无论如何,这不是你想要的网格布局。如果上面的内容不完全是你想要的,你可以通过在
网格视图周围放置一些
容器
并适当地使用你的状态来实现它。

所以我拍了这张照片到目前为止,另一种方法似乎很有效。根本不需要为此使用外部PhotoView依赖项。最好只在您的状态中添加一个
double\u scale;
,然后使用Flatter的内置
GestureDetector

GestureDetector(
  onScaleUpdate: (ScaleUpdateDetails scaleDetails) {
    setState(() {
      _scale = scaleDetails.horizontalScale;
    });
  },
  child: GridView.builder(
    gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: max(1, (16 / _scale).floor())),
    itemCount: _counter * 17,
    itemBuilder: (BuildContext context, int index) {
      return GridTile(
          child: SvgPicture.asset('assets/image.svg'));
    },
    padding: const EdgeInsets.all(4.0),
  ),
),
看看这张图片,它看起来真的是面向可缩放/可平移的照片-无论如何,这不是你想要的网格布局。如果上面的内容不是你想要的,你可以通过在
网格视图
周围放置一些
容器
并适当地使用你的状态来实现