twonly-app-dependencies/hand_signature/lib/src/signature_paint.dart
2025-12-26 18:50:40 +01:00

84 lines
2.8 KiB
Dart

import 'package:flutter/material.dart';
import '../signature.dart';
/// A [StatefulWidget] that uses [CustomPaint] to render a hand signature.
/// It rebuilds automatically whenever the signature data managed by [HandSignatureControl] changes.
///
/// This widget is typically used internally by [HandSignature] and [HandSignatureView].
class HandSignaturePaint extends StatefulWidget {
/// The controller that manages the signature paths and notifies listeners of changes.
final HandSignatureControl control;
/// The drawer responsible for rendering the signature paths on the canvas.
final HandSignatureDrawer drawer;
/// Optional callback that is invoked when the canvas size changes.
///
/// TODO: This callback should ideally be handled within the State of this widget
/// or by the [HandSignatureControl] itself, rather than being exposed here.
final bool Function(Size size)? onSize;
/// Creates a [HandSignaturePaint] widget.
///
/// [key] Controls how one widget replaces another widget in the tree.
/// [control] The [HandSignatureControl] instance that provides the signature data.
/// [drawer] The [HandSignatureDrawer] instance that defines how the signature is painted.
/// [onSize] An optional callback for canvas size changes.
const HandSignaturePaint({
Key? key,
required this.control,
required this.drawer,
this.onSize,
}) : super(key: key);
@override
_HandSignaturePaintState createState() => _HandSignaturePaintState();
}
/// The state class for [HandSignaturePaint].
///
/// This state subscribes to the [HandSignatureControl] to listen for changes
/// in signature data and triggers a rebuild of the widget when updates occur.
class _HandSignaturePaintState extends State<HandSignaturePaint> {
@override
void initState() {
super.initState();
// Add a listener to the control to trigger a rebuild on data changes.
widget.control.addListener(_updateState);
}
/// Callback method to trigger a widget rebuild.
void _updateState() {
setState(() {});
}
@override
void didUpdateWidget(HandSignaturePaint oldWidget) {
super.didUpdateWidget(oldWidget);
// If the control instance changes, update the listener.
if (oldWidget.control != widget.control) {
oldWidget.control.removeListener(_updateState);
widget.control.addListener(_updateState);
}
}
@override
Widget build(BuildContext context) {
// Use CustomPaint to draw the signature using PathSignaturePainter.
return CustomPaint(
painter: PathSignaturePainter(
paths: widget.control.paths,
drawer: widget.drawer,
onSize: widget.onSize,
),
);
}
@override
void dispose() {
// Remove the listener when the widget is disposed to prevent memory leaks.
widget.control.removeListener(_updateState);
super.dispose();
}
}