From 63457cdc673e48acc6dc8d96c37128ecd0d59d93 Mon Sep 17 00:00:00 2001 From: User3 Date: Mon, 26 May 2025 17:25:20 +0300 Subject: [PATCH] #sprint-1 --- example/lib/categories_section.dart | 24 ++++++++++ example/lib/main.dart | 2 + lib/cards/primary_card.dart | 3 ++ lib/categories.dart | 46 +++++++++++++++++++ lib/chips.dart | 23 ++++++---- lib/ui_kit.dart | 1 + test/ui_kit_test.dart | 68 ++++++++++++++++++++++++++++- 7 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 example/lib/categories_section.dart create mode 100644 lib/categories.dart diff --git a/example/lib/categories_section.dart b/example/lib/categories_section.dart new file mode 100644 index 0000000..7c16a29 --- /dev/null +++ b/example/lib/categories_section.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:ui_kit/categories.dart'; +import 'package:ui_kit/utils.dart'; + +class CategoriesSection extends StatefulWidget { + const CategoriesSection({super.key}); + + @override + State createState() => _CategoriesSectionState(); +} + +class _CategoriesSectionState extends State { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(bottom: height(context) * 5), + width: width(context) * 100, + height: 48, + child: CategoriesWidget( + itemsList: ['Популярные', 'Женщинам', 'Мужчинам'], + ), + ); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart index 5abbd17..00f537b 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -2,6 +2,7 @@ import 'package:example/bottom_sheet_section.dart'; import 'package:example/button_section.dart'; import 'package:example/card_section.dart'; import 'package:example/cart_button_section.dart'; +import 'package:example/categories_section.dart'; import 'package:example/chips_section.dart'; import 'package:example/colors_section.dart'; import 'package:example/counter_section.dart'; @@ -53,6 +54,7 @@ class MainApp extends StatelessWidget { ChipsSection(), LogInSection(), CartButtonSection(), + CategoriesSection(), ], ), ), diff --git a/lib/cards/primary_card.dart b/lib/cards/primary_card.dart index 1a1edc0..d564102 100644 --- a/lib/cards/primary_card.dart +++ b/lib/cards/primary_card.dart @@ -7,10 +7,12 @@ class PrimaryCard extends StatefulWidget { required this.title, required this.category, required this.price, + this.onChange, }); final String title; final String category; final String price; + final Function(bool value)? onChange; @override State createState() => _PrimaryCardState(); @@ -45,6 +47,7 @@ class _PrimaryCardState extends State { onPressed: () { setState(() { inCart = !inCart; + widget.onChange!(inCart); }); }, size: 'small', diff --git a/lib/categories.dart b/lib/categories.dart new file mode 100644 index 0000000..20edafa --- /dev/null +++ b/lib/categories.dart @@ -0,0 +1,46 @@ +import 'package:flutter/widgets.dart'; +import 'package:ui_kit/ui_kit.dart'; + +class CategoriesWidget extends StatefulWidget { + const CategoriesWidget({super.key, required this.itemsList}); + final List itemsList; + + @override + State createState() => _CategoriesWidgetState(); +} + +class _CategoriesWidgetState extends State { + @override + Widget build(BuildContext context) { + String selectedItem = widget.itemsList[0]; + + return SizedBox( + width: width(context) * 100, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: widget.itemsList.length, + itemBuilder: (BuildContext context, int index) { + final currentItem = widget.itemsList[index]; + Color currentItemColor = selectedItem == widget.itemsList[index] + ? primaryColor + : inputBgColor; + return Chips( + onPressed: () => { + setState(() { + selectedItem = currentItem; + }), + }, + buttonText: widget.itemsList[index], + buttonStyle: textMedium.copyWith( + fontWeight: FontWeight.w500, + color: selectedItem == widget.itemsList[index] + ? whiteColor + : descColor, + ), + bgColor: currentItemColor, + ); + }, + ), + ); + } +} diff --git a/lib/chips.dart b/lib/chips.dart index ffbeb66..de280dd 100644 --- a/lib/chips.dart +++ b/lib/chips.dart @@ -6,10 +6,12 @@ class Chips extends StatefulWidget { required this.buttonText, required this.buttonStyle, required this.bgColor, + this.onPressed, }); final String buttonText; final TextStyle buttonStyle; final Color bgColor; + final VoidCallback? onPressed; @override State createState() => _ChipsState(); @@ -18,15 +20,20 @@ class Chips extends StatefulWidget { class _ChipsState extends State { @override Widget build(BuildContext context) { - return Container( - width: 129, - height: 48, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 14), - decoration: BoxDecoration( - color: widget.bgColor, - borderRadius: BorderRadius.circular(10), + return GestureDetector( + onTap: () { + widget.onPressed; + }, + child: Container( + width: 129, + height: 48, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 14), + decoration: BoxDecoration( + color: widget.bgColor, + borderRadius: BorderRadius.circular(10), + ), + child: Text(widget.buttonText, style: widget.buttonStyle), ), - child: Text(widget.buttonText, style: widget.buttonStyle), ); } } diff --git a/lib/ui_kit.dart b/lib/ui_kit.dart index 2dda6b6..1fa7a0a 100644 --- a/lib/ui_kit.dart +++ b/lib/ui_kit.dart @@ -19,3 +19,4 @@ export 'chips.dart'; export "cards/log_in_card.dart"; export 'cart_button.dart'; export 'bubbles.dart'; +export 'categories.dart'; diff --git a/test/ui_kit_test.dart b/test/ui_kit_test.dart index 0da434d..48631b7 100644 --- a/test/ui_kit_test.dart +++ b/test/ui_kit_test.dart @@ -1,5 +1,71 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:ui_kit/ui_kit.dart'; void main() { - test('adds one to input values', () {}); + testWidgets( + "Инпут ошибки. Проверяемые параметры: фон, обводка, Наличие текста ошибки и соответствие его цвета", + (WidgetTester tester) async { + final TextEditingController controller = TextEditingController(); + await tester.pumpWidget( + MaterialApp( + builder: (context, child) => Scaffold( + body: Column( + children: [ + InputWidget( + controller: controller, + hintText: 'This error input', + errorText: 'Eror Input Text', + isError: 'true', + ), + ], + ), + ), + ), + ); + await tester.pumpAndSettle(); + final input = find.byType(InputWidget); + expect(input.hasFound, true); + }, + ); + testWidgets( + "Кнопка chips. Кнопка при значениях status ON и OFF соответствует макету", + (WidgetTester tester) async { + bool isSelected = false; + Color bgColor = primaryColor; + + await tester.pumpWidget( + MaterialApp( + builder: (context, child) => Scaffold( + body: Column( + children: [ + TextButton( + onPressed: () { + isSelected = !isSelected; + bgColor = bgColor == primaryColor + ? inputBgColor + : primaryColor; + }, + child: Text('Click to make chip enabled'), + ), + Chips( + buttonText: 'Testtest', + buttonStyle: title2Semibold, + bgColor: bgColor, + ), + ], + ), + ), + ), + ); + await tester.pumpAndSettle(); + final currentWidget = find.widgetWithText( + TextButton, + 'Click to make chip enabled', + ); + await tester.tap(currentWidget); + expect(isSelected, true); + expect(bgColor, inputBgColor); + }, + ); }