Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 缩放中的性能问题_Flutter_Dart - Fatal编程技术网

Flutter 缩放中的性能问题

Flutter 缩放中的性能问题,flutter,dart,Flutter,Dart,我创建了Myapp类和Panner类,用于在Flatter中缩放、滚动和平移图像。我在缩放图像时遇到问题 import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:zoomexample/Panner.dart'; void main() => runApp(MyApp()); class MyApp extend

我创建了Myapp类和Panner类,用于在Flatter中缩放、滚动和平移图像。我在缩放图像时遇到问题


    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:zoomexample/Panner.dart';
    void main() => runApp(MyApp());
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Flutter Demo',
            showPerformanceOverlay: true,
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home:
            Scaffold(appBar: AppBar(title: Text("Zoom view",)),body:Center(child: Panner(),))
        );
      }
    } 

 panner class

    import 'dart:typed_data';
    import 'package:flutter/gestures.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/services.dart';
    class Panner extends StatefulWidget {

      @override
      State<StatefulWidget> createState() => PannerState();

    }

    class PannerState extends State<Panner> {
      String assets ;
      Uint8List pageData;
      double scrollPosx=0,scrollPosy=0,previousPosx=0,previousPosy=0;
      double scale = 1.0, previousScale = 1.0;
      double originalImageHeight, imageHeight;
      Offset _offset = Offset.zero;
      Offset _previousOffset, _startingFocalPoint;
      ScrollController _verticalController = ScrollController();
      ScrollController _horizontalController = ScrollController();

      _findPosition()
      {    

            _previousOffset=Offset(-scrollPosx,-scrollPosy);
            previousPosx=-scrollPosx;
            previousPosy=-scrollPosy;
        }
      }
      Future _getImage(BuildContext context) async {
        if(pageData == null)
        {
          assets = 'images/squirrel.jpg';
          imageHeight = originalImageHeight = MediaQuery.of(context).size.height; 
          pageData = ((await rootBundle.load(assets)).buffer.asUint8List());
        }
      }
      _onScaleUpdate(ScaleUpdateDetails details) {
        scale = details.scale * previousScale;
        if(scale!=1.0) {
          if (scale < 0.5) {
            scale = 0.5;
          }
          imageHeight = originalImageHeight * scale;
          setState(() {});
          final Offset normalizedOffset = (_startingFocalPoint -
              _previousOffset) / previousScale;
          _offset = details.focalPoint - normalizedOffset * scale;
          _horizontalController.jumpTo(-_offset.dx);
          _verticalController.jumpTo(-_offset.dy);

        }

      }

      _onScaleStart(ScaleStartDetails details) {
        _startingFocalPoint = details.focalPoint;
        previousScale = scale;
        _previousOffset = _offset;
        scrollPosx=_horizontalController.position.pixels;
        scrollPosy=_verticalController.position.pixels;
        if(previousPosx!=scrollPosx || previousPosy!=scrollPosy)
          {
            _findPosition();
          }
    setState(() {});

      }
      @override
      Widget build(BuildContext context) {
        return FutureBuilder(
            future: _getImage(context),
            builder: (context, snapshot) {
              if(pageData==null)
              {
                return CircularProgressIndicator();
              }
           return  GestureDetector(
                    onScaleStart: _onScaleStart,
                    onScaleUpdate: _onScaleUpdate,
                    // onScaleEnd: _onScaleEnd,
                  child: SingleChildScrollView(
                    scrollDirection: Axis.horizontal,
                    controller: _horizontalController,
                    child: SingleChildScrollView(
                        scrollDirection: Axis.vertical,
                        controller: _verticalController,
                     child: Align(
                        alignment: FractionalOffset.center,
                          child: Image.memory(
                            pageData,
                            height: imageHeight,
                            fit: BoxFit.cover,
                           width: imageWidth,
                          ),
                        )
                    ),
                  )
                  ) ;
            });
      }
    }


进口“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
导入“package:zoomexample/Panner.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
showPerformanceOverlay:正确,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:
脚手架(appBar:appBar(标题:文本(“缩放视图”),主体:中心(子项:Panner(),))
);
}
} 
潘纳级
导入“dart:键入的_数据”;
导入“package:flatter/signatures.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
导入“包:flifter/services.dart”;
类Panner扩展了StatefulWidget{
@凌驾
State createState()=>PannerState();
}
类PannerState扩展了状态{
串资产;
UINT8列表页面数据;
双scrollPosx=0,scrollPosy=0,previousPosx=0,previousPosy=0;
双刻度=1.0,以前的刻度=1.0;
双源图像高度、图像高度;
偏移量_Offset=Offset.0;
偏移量_先前的偏移量,_起始焦点;
ScrollController_verticalController=ScrollController();
ScrollController_horizontalController=ScrollController();
_findPosition()
{    
_previousOffset=偏移(-scrollPosx,-scrollPosy);
previousPosx=-scrollPosx;
previousPosy=-scrollPosy;
}
}
Future\u getImage(BuildContext上下文)异步{
如果(pageData==null)
{
资产='images/squirrel.jpg';
imageHeight=originalImageHeight=MediaQuery.of(context).size.height;
pageData=((wait rootBundle.load(assets)).buffer.asUint8List());
}
}
_onScaleUpdate(缩放更新详细信息){
比例=细节。比例*以前的比例;
如果(比例!=1.0){
如果(刻度<0.5){
比例=0.5;
}
图像高度=原始图像高度*比例;
setState((){});
最终偏移量规格化偏移量=(_startingFocalPoint-
_上一个偏移量)/上一个刻度;
_偏移=细节。焦点-规格化偏移*比例;
_水平控制器.跳到(-u offset.dx);
_垂直控制器。跳到(-U偏移量dy);
}
}
_onScaleStart(ScaleStartDetails){
_startingFocalPoint=详细信息。focalPoint;
以前的比例=比例;
_上一个偏移量=_偏移量;
scrollPosx=_horizontalController.position.pixels;
scrollPosy=_verticalController.position.pixels;
如果(previousPosx!=scrollPosx | | previousPosy!=scrollPosy)
{
_findPosition();
}
setState((){});
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:_getImage(上下文),
生成器:(上下文,快照){
如果(pageData==null)
{
返回循环ProgressIndicator();
}
返回手势检测器(
onScaleStart:\u onScaleStart,
onScaleUpdate:\u onScaleUpdate,
//onScaleEnd:_onScaleEnd,
子:SingleChildScrollView(
滚动方向:轴水平,
控制器:_水平控制器,
子:SingleChildScrollView(
滚动方向:轴垂直,
控制器:_垂直控制器,
子对象:对齐(
对齐:分馏loffset.center,
孩子:图像。记忆(
页面数据,
高度:图像高度,
适合:BoxFit.cover,
宽度:图像宽度,
),
)
),
)
) ;
});
}
}

对于缩放图像,我使用手势检测器。缩放图像时,它无法顺利工作,多指缩放几次都无法正确响应,当多指缩放在当时没有响应时,控制台指示应用程序可以在其主线程上执行太多的工作。请提前感谢

如果日志没有显示任何错误,则很可能是因为您处于调试模式,这会显著降低性能,以便为您提供调试功能。尝试构建发布版本,看看问题是否仍然存在。我以发布模式构建应用程序。我仍然面临着缩放的问题。当我缩放一幅图像时,它的响应不正常