dart Flutter CustomPaint未重新绘制

pdsfdshx  于 11个月前  发布在  Flutter
关注(0)|答案(3)|浏览(104)

我不能让定制的油漆工重新粉刷。我试着使用Listable,回调,setState,没有任何东西重新绘制屏幕。
文档是这样说的:
触发重绘的最有效方法是:

  • 扩展这个类并向CustomPainter的构造函数提供一个重绘参数,在该构造函数中,该对象在需要重绘时通知它的侦听器。
  • 扩展列表(例如通过ChangeNotifier)并实现CustomPainter,以便对象本身直接提供通知。无论哪种情况,CustomPaint构件或RenderCustomPaint渲染对象都将侦听Listable并在动画滴答时重新绘制,从而避免管道的构建和布局阶段。

但代码并没有按预期工作。
这是我正在使用的代码:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

main() {
  runApp(MaterialApp(
    home: Scaffold(appBar: AppBar(), body: Pad()),
  ));
}

class Pad extends StatefulWidget {
  @override
  _PadState createState() => _PadState();
}

class _PadState extends State<Pad> {
  @override
  Widget build(BuildContext context) {
    final painter = Painter();
    return GestureDetector(
        onTap: () {
          setState(() {
            painter.addY(10);
          });
        },
        child: CustomPaint(
          painter: painter,
          child: Container(),
        ));
  }
}

class Painter extends CustomPainter {
  double y = 10;

  addY(val) {
    y += val;
  }

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawCircle(Offset(size.width / 2, y++), 100, Paint());
  }

  @override
  bool shouldRepaint(Painter oldDelegate) {
    return true;
  }
}

字符串

pcww981p

pcww981p1#

Listenable工作得很好,使用ValueNotifier为例,请参阅https://github.com/pskink/matrix_gesture_detector/blob/master/example/lib/custom_painter_demo.dart获取一些示例代码

yptwkmov

yptwkmov2#

我不知道为什么,但当我添加一个空的DropdownButtonFormField小部件时,它工作了。
即使shouldRepaint函数也总是返回false。当点击GestureDetector时,paint函数总是重新调用。

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

main() {
  runApp(MaterialApp(
    home: Scaffold(appBar: AppBar(), body: const Pad()),
  ));
}

class Pad extends StatefulWidget {
  const Pad({Key? key}) : super(key: key);

  @override
  _PadState createState() => _PadState();
}

class _PadState extends State<Pad> {
  @override
  Widget build(BuildContext context) {
    final painter = Painter();
    return Stack(
      children: [
        SizedBox(
          width: 0,
          height: 0,
          child: DropdownButtonFormField<String>(
              onChanged: (value) {}, items: const []),
        ),
        GestureDetector(
            onTap: () {
              setState(() {
                painter.addY(10);
              });
            },
            child: CustomPaint(
              painter: Painter(),
              child: Container(),
            )),
      ],
    );
  }
}

class Painter extends CustomPainter {
  double y = 10;

  addY(val) {
    y += val;
  }

  @override
  void paint(Canvas canvas, Size size) {
    debugPrint('paint');
    canvas.drawCircle(Offset(size.width / 2, y++), 100, Paint());
  }

  @override
  bool shouldRepaint(Painter oldDelegate) {
    return false;
  }
}

字符串

ycggw6v2

ycggw6v23#

对于“D c H i Tr n”代码,只需删除SizedBox()并将shouldRepaint返回值更改为'true',然后它就可以正常工作了。

相关问题