my_cart_num.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'package:cs_resources/theme/app_colors_theme.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:widgets/my_text_view.dart';
  4. import 'package:widgets/utils/dark_theme_util.dart';
  5. class MyCartNum extends StatefulWidget {
  6. final int initialNum;
  7. final ValueChanged<int> onChange; // 添加回调函数
  8. MyCartNum({Key? key, this.initialNum = 0, required this.onChange}) : super(key: key);
  9. @override
  10. _MyCartNumState createState() => _MyCartNumState();
  11. }
  12. class _MyCartNumState extends State<MyCartNum> {
  13. late int _num;
  14. @override
  15. void initState() {
  16. super.initState();
  17. _num = widget.initialNum;
  18. }
  19. void _incrementNum() {
  20. setState(() {
  21. _num++;
  22. widget.onChange(_num); // 调用回调函数
  23. });
  24. }
  25. void _decrementNum() {
  26. setState(() {
  27. if (_num >= 1) {
  28. _num--;
  29. widget.onChange(_num); // 调用回调函数
  30. }
  31. });
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. return Row(
  36. mainAxisAlignment: MainAxisAlignment.start,
  37. crossAxisAlignment: CrossAxisAlignment.center,
  38. mainAxisSize: MainAxisSize.min,
  39. children: [
  40. RawMaterialButton(
  41. constraints: const BoxConstraints.tightFor(
  42. width: 27.5,
  43. height: 27.5,
  44. ),
  45. elevation: 1,
  46. shape: CircleBorder(
  47. side: BorderSide(width: 1.0, color: context.appColors.textPrimary),
  48. ),
  49. fillColor: context.appColors.textPrimary,
  50. splashColor: context.appColors.textPrimary,
  51. textStyle: TextStyle(color: DarkThemeUtil.multiColors(context, Colors.white, darkColor: Colors.black54)),
  52. onPressed: _decrementNum,
  53. child: const Icon(Icons.remove),
  54. ),
  55. MyTextView(
  56. '$_num',
  57. fontSize: 15,
  58. isFontRegular: true,
  59. textAlign: TextAlign.center,
  60. boxWidth: 30,
  61. ),
  62. RawMaterialButton(
  63. constraints: const BoxConstraints.tightFor(
  64. width: 27.5,
  65. height: 27.5,
  66. ),
  67. elevation: 1,
  68. shape: CircleBorder(
  69. side: BorderSide(width: 1.0, color: context.appColors.textPrimary),
  70. ),
  71. fillColor: context.appColors.textPrimary,
  72. splashColor: context.appColors.textPrimary,
  73. textStyle: TextStyle(color: DarkThemeUtil.multiColors(context, Colors.white, darkColor: Colors.black54)),
  74. onPressed: _incrementNum,
  75. child: const Icon(Icons.add),
  76. ),
  77. ],
  78. );
  79. }
  80. }