Files
numstation-flutter/lib/flutterlib/flutter_count_controller.dart
2023-12-27 16:10:09 +08:00

73 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
class FlutterCountController extends StatefulWidget {
const FlutterCountController({
Key? key,
required this.decrementIconBuilder,
required this.incrementIconBuilder,
required this.countBuilder,
required this.count,
required this.updateCount,
this.stepSize = 1,
this.minimum,
this.maximum,
this.contentPadding = const EdgeInsets.symmetric(horizontal: 25.0),
}) : super(key: key);
final Widget Function(bool enabled) decrementIconBuilder;
final Widget Function(bool enabled) incrementIconBuilder;
final Widget Function(int count) countBuilder;
final int count;
final Function(int) updateCount;
final int stepSize;
final int? minimum;
final int? maximum;
final EdgeInsetsGeometry contentPadding;
@override
_FlutterCountControllerState createState() =>
_FlutterCountControllerState();
}
class _FlutterCountControllerState
extends State<FlutterCountController> {
int get count => widget.count;
int? get minimum => widget.minimum;
int? get maximum => widget.maximum;
int get stepSize => widget.stepSize;
bool get canDecrement => minimum == null || count - stepSize >= minimum!;
bool get canIncrement => maximum == null || count + stepSize <= maximum!;
void _decrementCounter() {
if (canDecrement) {
setState(() => widget.updateCount(count - stepSize));
}
}
void _incrementCounter() {
if (canIncrement) {
setState(() => widget.updateCount(count + stepSize));
}
}
@override
Widget build(BuildContext context) => Padding(
padding: widget.contentPadding,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
InkWell(
onTap: _decrementCounter,
child: widget.decrementIconBuilder(canDecrement),
),
widget.countBuilder(count),
InkWell(
onTap: _incrementCounter,
child: widget.incrementIconBuilder(canIncrement),
),
],
),
);
}