【问题标题】:Flutter CustomPaint is not repaintingFlutter CustomPaint 不会重绘
【发布时间】:2020-02-23 23:02:34
【问题描述】:

我无法让自定义画家重新绘制。 我尝试使用 Listenable、回调、setState 并没有重绘屏幕。

文档是这样说的:

触发重绘的最有效方法是:

  • 扩展此类并向 CustomPainter 的构造函数提供一个重绘参数,该对象会在该对象通知其侦听器何时重绘。
  • 扩展 Listenable(例如通过 ChangeNotifier)并实现 CustomPainter,以便对象本身直接提供通知。 在任何一种情况下,CustomPaint 小部件或 RenderCustomPaint 渲染对象都会在动画滴答时侦听 Listenable 并重新绘制,从而避免管道的构建和布局阶段。

但代码没有按预期工作。

这是我正在使用的代码:

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;
  }
}

【问题讨论】:

    标签: android flutter dart


    【解决方案1】:

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

    【讨论】:

    • 我使用更改通知器来调用有状态小部件的 setState?
    猜你喜欢
    • 2020-01-12
    • 2018-12-02
    • 2022-10-19
    • 2020-08-17
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多