diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 10d0c59c..348b81ca 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -5,7 +5,7 @@ import 'package:apidash/utils/utils.dart'; import 'package:apidash/consts.dart'; import "snackbars.dart"; -class CopyButton extends StatefulWidget { +class CopyButton extends StatelessWidget { const CopyButton({ super.key, required this.toCopy, @@ -15,21 +15,16 @@ class CopyButton extends StatefulWidget { final String toCopy; final bool showLabel; - @override - State createState() => _CopyButtonState(); -} - -class _CopyButtonState extends State { @override Widget build(BuildContext context) { var sm = ScaffoldMessenger.of(context); return Tooltip( - message: widget.showLabel ? '' : kLabelCopy, + message: showLabel ? '' : kLabelCopy, child: SizedBox( - width: widget.showLabel ? null : kTextButtonMinWidth, + width: showLabel ? null : kTextButtonMinWidth, child: TextButton( onPressed: () async { - await Clipboard.setData(ClipboardData(text: widget.toCopy)); + await Clipboard.setData(ClipboardData(text: toCopy)); sm.hideCurrentSnackBar(); sm.showSnackBar(getSnackBar("Copied")); }, @@ -40,7 +35,7 @@ class _CopyButtonState extends State { Icons.content_copy, size: 20, ), - if (widget.showLabel) const Text(kLabelCopy) + if (showLabel) const Text(kLabelCopy) ], ), ), @@ -49,7 +44,7 @@ class _CopyButtonState extends State { } } -class SendRequestButton extends StatefulWidget { +class SendRequestButton extends StatelessWidget { const SendRequestButton({ super.key, required this.activeId, @@ -61,29 +56,17 @@ class SendRequestButton extends StatefulWidget { final String? sentRequestId; final void Function() onTap; - @override - State createState() => _SendRequestButtonState(); -} - -class _SendRequestButtonState extends State { - @override - void initState() { - super.initState(); - } - @override Widget build(BuildContext context) { - bool disable = widget.sentRequestId != null; + bool disable = sentRequestId != null; return FilledButton( - onPressed: disable ? null : widget.onTap, + onPressed: disable ? null : onTap, child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( disable - ? (widget.activeId == widget.sentRequestId - ? kLabelSending - : kLabelBusy) + ? (activeId == sentRequestId ? kLabelSending : kLabelBusy) : kLabelSend, style: kTextStyleButton, ), @@ -99,7 +82,7 @@ class _SendRequestButtonState extends State { } } -class SaveInDownloadsButton extends StatefulWidget { +class SaveInDownloadsButton extends StatelessWidget { const SaveInDownloadsButton({ super.key, this.content, @@ -115,29 +98,24 @@ class SaveInDownloadsButton extends StatefulWidget { final String? name; final bool showLabel; - @override - State createState() => _SaveInDownloadsButtonState(); -} - -class _SaveInDownloadsButtonState extends State { @override Widget build(BuildContext context) { var sm = ScaffoldMessenger.of(context); return Tooltip( - message: widget.showLabel ? '' : kLabelDownload, + message: showLabel ? '' : kLabelDownload, child: SizedBox( - width: widget.showLabel ? null : kTextButtonMinWidth, + width: showLabel ? null : kTextButtonMinWidth, child: TextButton( - onPressed: (widget.content != null) + onPressed: (content != null) ? () async { var message = ""; var path = await getFileDownloadpath( - widget.name, - widget.ext ?? getFileExtension(widget.mimeType), + name, + ext ?? getFileExtension(mimeType), ); if (path != null) { try { - await saveFile(path, widget.content!); + await saveFile(path, content!); var sp = getShortPath(path); message = 'Saved to $sp'; } catch (e) { @@ -157,7 +135,7 @@ class _SaveInDownloadsButtonState extends State { Icons.download, size: 20, ), - if (widget.showLabel) const Text(kLabelDownload) + if (showLabel) const Text(kLabelDownload) ], ), ), @@ -166,7 +144,7 @@ class _SaveInDownloadsButtonState extends State { } } -class RepoButton extends StatefulWidget { +class RepoButton extends StatelessWidget { const RepoButton({ super.key, this.text, @@ -176,15 +154,10 @@ class RepoButton extends StatefulWidget { final String? text; final IconData? icon; - @override - State createState() => _RepoButtonState(); -} - -class _RepoButtonState extends State { @override Widget build(BuildContext context) { - var label = widget.text ?? "GitHub"; - if (widget.icon == null) { + var label = text ?? "GitHub"; + if (icon == null) { return FilledButton( onPressed: () { launchUrl(Uri.parse(kGitUrl)); @@ -200,7 +173,7 @@ class _RepoButtonState extends State { launchUrl(Uri.parse(kGitUrl)); }, icon: Icon( - widget.icon, + icon, size: 20.0, ), label: Text( @@ -211,7 +184,7 @@ class _RepoButtonState extends State { } } -class DiscordButton extends StatefulWidget { +class DiscordButton extends StatelessWidget { const DiscordButton({ super.key, this.text, @@ -219,14 +192,9 @@ class DiscordButton extends StatefulWidget { final String? text; - @override - State createState() => _DiscordButtonState(); -} - -class _DiscordButtonState extends State { @override Widget build(BuildContext context) { - var label = widget.text ?? 'Discord Server'; + var label = text ?? 'Discord Server'; return FilledButton.icon( onPressed: () { launchUrl(Uri.parse(kDiscordUrl)); @@ -242,3 +210,27 @@ class _DiscordButtonState extends State { ); } } + +class SaveButton extends StatelessWidget { + const SaveButton({ + super.key, + this.onPressed, + }); + + final VoidCallback? onPressed; + + @override + Widget build(BuildContext context) { + return TextButton.icon( + onPressed: onPressed, + icon: const Icon( + Icons.save, + size: 20, + ), + label: const Text( + kLabelSave, + style: kTextStyleButton, + ), + ); + } +} diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 43b3cb0c..e99a71f8 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -129,15 +129,11 @@ class SidebarRequestCard extends StatelessWidget { } } -class RequestDetailsCard extends StatefulWidget { +class RequestDetailsCard extends StatelessWidget { const RequestDetailsCard({super.key, this.child}); final Widget? child; @override - State createState() => _RequestDetailsCardState(); -} - -class _RequestDetailsCardState extends State { @override Widget build(BuildContext context) { return Card( @@ -148,7 +144,7 @@ class _RequestDetailsCardState extends State { borderRadius: kBorderRadius12, ), elevation: 0, - child: widget.child, + child: child, ); } } diff --git a/lib/widgets/codegen_previewer.dart b/lib/widgets/codegen_previewer.dart index 537458b7..298610c7 100644 --- a/lib/widgets/codegen_previewer.dart +++ b/lib/widgets/codegen_previewer.dart @@ -97,7 +97,7 @@ List generateSpans( return spans; } -class ViewCodePane extends StatefulWidget { +class ViewCodePane extends StatelessWidget { const ViewCodePane({ super.key, required this.code, @@ -109,11 +109,6 @@ class ViewCodePane extends StatefulWidget { final CodegenLanguage codegenLanguage; final Function(CodegenLanguage?) onChangedCodegenLanguage; - @override - State createState() => _ViewCodePaneState(); -} - -class _ViewCodePaneState extends State { @override Widget build(BuildContext context) { var codeTheme = Theme.of(context).brightness == Brightness.light @@ -145,17 +140,17 @@ class _ViewCodePaneState extends State { children: [ Expanded( child: DropdownButtonCodegenLanguage( - codegenLanguage: widget.codegenLanguage, - onChanged: widget.onChangedCodegenLanguage, + codegenLanguage: codegenLanguage, + onChanged: onChangedCodegenLanguage, ), ), CopyButton( - toCopy: widget.code, + toCopy: code, showLabel: showLabel, ), SaveInDownloadsButton( - content: stringToBytes(widget.code), - ext: widget.codegenLanguage.ext, + content: stringToBytes(code), + ext: codegenLanguage.ext, showLabel: showLabel, ) ], @@ -168,9 +163,9 @@ class _ViewCodePaneState extends State { padding: kP8, decoration: textContainerdecoration, child: CodeGenPreviewer( - code: widget.code, + code: code, theme: codeTheme, - language: widget.codegenLanguage.codeHighlightLang, + language: codegenLanguage.codeHighlightLang, textStyle: kCodeStyle, ), ), diff --git a/lib/widgets/dropdowns.dart b/lib/widgets/dropdowns.dart index e8290714..940ac34c 100644 --- a/lib/widgets/dropdowns.dart +++ b/lib/widgets/dropdowns.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:apidash/utils/utils.dart'; import 'package:apidash/consts.dart'; -class DropdownButtonHttpMethod extends StatefulWidget { +class DropdownButtonHttpMethod extends StatelessWidget { const DropdownButtonHttpMethod({ super.key, this.method, @@ -12,30 +12,19 @@ class DropdownButtonHttpMethod extends StatefulWidget { final HTTPVerb? method; final void Function(HTTPVerb? value)? onChanged; - @override - State createState() => - _DropdownButtonHttpMethodState(); -} - -class _DropdownButtonHttpMethodState extends State { - @override - void initState() { - super.initState(); - } - @override Widget build(BuildContext context) { final surfaceColor = Theme.of(context).colorScheme.surface; return DropdownButton( focusColor: surfaceColor, - value: widget.method, + value: method, icon: const Icon(Icons.unfold_more_rounded), elevation: 4, underline: Container( height: 0, ), borderRadius: kBorderRadius12, - onChanged: widget.onChanged, + onChanged: onChanged, items: HTTPVerb.values.map>((HTTPVerb value) { return DropdownMenuItem( value: value, @@ -58,7 +47,7 @@ class _DropdownButtonHttpMethodState extends State { } } -class DropdownButtonContentType extends StatefulWidget { +class DropdownButtonContentType extends StatelessWidget { const DropdownButtonContentType({ super.key, this.contentType, @@ -68,18 +57,12 @@ class DropdownButtonContentType extends StatefulWidget { final ContentType? contentType; final void Function(ContentType?)? onChanged; - @override - State createState() => - _DropdownButtonContentTypeState(); -} - -class _DropdownButtonContentTypeState extends State { @override Widget build(BuildContext context) { final surfaceColor = Theme.of(context).colorScheme.surface; return DropdownButton( focusColor: surfaceColor, - value: widget.contentType, + value: contentType, icon: const Icon( Icons.unfold_more_rounded, size: 16, @@ -91,7 +74,7 @@ class _DropdownButtonContentTypeState extends State { underline: Container( height: 0, ), - onChanged: widget.onChanged, + onChanged: onChanged, borderRadius: kBorderRadius12, items: ContentType.values .map>((ContentType value) { @@ -110,28 +93,22 @@ class _DropdownButtonContentTypeState extends State { } } -class DropdownButtonCodegenLanguage extends StatefulWidget { +class DropdownButtonCodegenLanguage extends StatelessWidget { const DropdownButtonCodegenLanguage({ super.key, this.codegenLanguage, this.onChanged, }); - @override - State createState() => - _DropdownButtonCodegenLanguageState(); final CodegenLanguage? codegenLanguage; final void Function(CodegenLanguage?)? onChanged; -} -class _DropdownButtonCodegenLanguageState - extends State { @override Widget build(BuildContext context) { final surfaceColor = Theme.of(context).colorScheme.surface; return DropdownButton( focusColor: surfaceColor, - value: widget.codegenLanguage, + value: codegenLanguage, icon: const Icon( Icons.unfold_more_rounded, size: 16, @@ -143,7 +120,7 @@ class _DropdownButtonCodegenLanguageState underline: Container( height: 0, ), - onChanged: widget.onChanged, + onChanged: onChanged, borderRadius: kBorderRadius12, items: CodegenLanguage.values .map>((CodegenLanguage value) { diff --git a/lib/widgets/intro_message.dart b/lib/widgets/intro_message.dart index 3feaf712..970596d3 100644 --- a/lib/widgets/intro_message.dart +++ b/lib/widgets/intro_message.dart @@ -5,16 +5,11 @@ import '../consts.dart'; import 'markdown.dart'; import 'error_message.dart'; -class IntroMessage extends StatefulWidget { +class IntroMessage extends StatelessWidget { const IntroMessage({ super.key, }); - @override - State createState() => _IntroMessageState(); -} - -class _IntroMessageState extends State { @override Widget build(BuildContext context) { late String text; diff --git a/lib/widgets/markdown.dart b/lib/widgets/markdown.dart index a9dde1dc..c1467fba 100644 --- a/lib/widgets/markdown.dart +++ b/lib/widgets/markdown.dart @@ -4,7 +4,7 @@ import 'package:markdown/markdown.dart' as md; import 'package:url_launcher/url_launcher.dart'; import 'buttons.dart'; -class CustomMarkdown extends StatefulWidget { +class CustomMarkdown extends StatelessWidget { const CustomMarkdown({ super.key, required this.data, @@ -13,11 +13,6 @@ class CustomMarkdown extends StatefulWidget { final String data; final EdgeInsets padding; - @override - State createState() => _CustomMarkdownState(); -} - -class _CustomMarkdownState extends State { @override Widget build(BuildContext context) { final mdStyleSheet = MarkdownStyleSheet( @@ -25,9 +20,9 @@ class _CustomMarkdownState extends State { p: Theme.of(context).textTheme.titleMedium, ); return Markdown( - padding: widget.padding, + padding: padding, styleSheet: mdStyleSheet, - data: widget.data, + data: data, selectable: true, extensionSet: md.ExtensionSet.gitHubFlavored, onTapLink: (text, href, title) { diff --git a/lib/widgets/menus.dart b/lib/widgets/menus.dart index 02a5a15c..81958a02 100644 --- a/lib/widgets/menus.dart +++ b/lib/widgets/menus.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; -class RequestCardMenu extends StatefulWidget { +class RequestCardMenu extends StatelessWidget { const RequestCardMenu({ super.key, this.onSelected, @@ -9,18 +9,13 @@ class RequestCardMenu extends StatefulWidget { final Function(RequestItemMenuOption)? onSelected; - @override - State createState() => _RequestCardMenuState(); -} - -class _RequestCardMenuState extends State { @override Widget build(BuildContext context) { return PopupMenuButton( padding: EdgeInsets.zero, splashRadius: 14, iconSize: 14, - onSelected: widget.onSelected, + onSelected: onSelected, itemBuilder: (BuildContext context) => >[ const PopupMenuItem( diff --git a/lib/widgets/response_widgets.dart b/lib/widgets/response_widgets.dart index da905749..960fc9dd 100644 --- a/lib/widgets/response_widgets.dart +++ b/lib/widgets/response_widgets.dart @@ -49,7 +49,7 @@ class SendingWidget extends StatelessWidget { } } -class ResponsePaneHeader extends StatefulWidget { +class ResponsePaneHeader extends StatelessWidget { const ResponsePaneHeader({ super.key, this.responseStatus, @@ -60,11 +60,7 @@ class ResponsePaneHeader extends StatefulWidget { final int? responseStatus; final String? message; final Duration? time; - @override - State createState() => _ResponsePaneHeaderState(); -} -class _ResponsePaneHeaderState extends State { @override Widget build(BuildContext context) { return Padding( @@ -81,10 +77,10 @@ class _ResponsePaneHeaderState extends State { text: "Response (", ), TextSpan( - text: "${widget.responseStatus}", + text: "$responseStatus", style: TextStyle( color: getResponseStatusCodeColor( - widget.responseStatus, + responseStatus, brightness: Theme.of(context).brightness, ), fontFamily: kCodeStyle.fontFamily, @@ -100,13 +96,13 @@ class _ResponsePaneHeaderState extends State { kHSpacer20, Expanded( child: Text( - widget.message ?? "", + message ?? "", softWrap: false, overflow: TextOverflow.ellipsis, style: Theme.of(context).textTheme.titleMedium!.copyWith( fontFamily: kCodeStyle.fontFamily, color: getResponseStatusCodeColor( - widget.responseStatus, + responseStatus, brightness: Theme.of(context).brightness, ), ), @@ -114,7 +110,7 @@ class _ResponsePaneHeaderState extends State { ), kHSpacer20, Text( - humanizeDuration(widget.time), + humanizeDuration(time), style: Theme.of(context).textTheme.titleMedium!.copyWith( fontFamily: kCodeStyle.fontFamily, color: Theme.of(context).colorScheme.secondary, @@ -207,7 +203,7 @@ class _ResponseTabViewState extends State } } -class ResponseHeadersHeader extends StatefulWidget { +class ResponseHeadersHeader extends StatelessWidget { const ResponseHeadersHeader({ super.key, required this.map, @@ -216,11 +212,7 @@ class ResponseHeadersHeader extends StatefulWidget { final Map map; final String name; - @override - State createState() => _ResponseHeadersHeaderState(); -} -class _ResponseHeadersHeaderState extends State { @override Widget build(BuildContext context) { return SizedBox( @@ -229,15 +221,15 @@ class _ResponseHeadersHeaderState extends State { children: [ Expanded( child: Text( - "${widget.name} (${widget.map.length} items)", + "$name (${map.length} items)", style: Theme.of(context).textTheme.labelLarge!.copyWith( fontWeight: FontWeight.bold, ), ), ), - if (widget.map.isNotEmpty) + if (map.isNotEmpty) CopyButton( - toCopy: kEncoder.convert(widget.map), + toCopy: kEncoder.convert(map), ), ], ), @@ -247,7 +239,7 @@ class _ResponseHeadersHeaderState extends State { const kHeaderRow = ["Header Name", "Header Value"]; -class ResponseHeaders extends StatefulWidget { +class ResponseHeaders extends StatelessWidget { const ResponseHeaders({ super.key, required this.responseHeaders, @@ -256,11 +248,7 @@ class ResponseHeaders extends StatefulWidget { final Map responseHeaders; final Map requestHeaders; - @override - State createState() => _ResponseHeadersState(); -} -class _ResponseHeadersState extends State { @override Widget build(BuildContext context) { return Padding( @@ -268,25 +256,25 @@ class _ResponseHeadersState extends State { child: ListView( children: [ ResponseHeadersHeader( - map: widget.responseHeaders, + map: responseHeaders, name: "Response Headers", ), - if (widget.responseHeaders.isNotEmpty) kVSpacer5, - if (widget.responseHeaders.isNotEmpty) + if (responseHeaders.isNotEmpty) kVSpacer5, + if (responseHeaders.isNotEmpty) MapTable( - map: widget.responseHeaders, + map: responseHeaders, colNames: kHeaderRow, firstColumnHeaderCase: true, ), kVSpacer10, ResponseHeadersHeader( - map: widget.requestHeaders, + map: requestHeaders, name: "Request Headers", ), - if (widget.requestHeaders.isNotEmpty) kVSpacer5, - if (widget.requestHeaders.isNotEmpty) + if (requestHeaders.isNotEmpty) kVSpacer5, + if (requestHeaders.isNotEmpty) MapTable( - map: widget.requestHeaders, + map: requestHeaders, colNames: kHeaderRow, firstColumnHeaderCase: true, ), @@ -296,21 +284,17 @@ class _ResponseHeadersState extends State { } } -class ResponseBody extends StatefulWidget { +class ResponseBody extends StatelessWidget { const ResponseBody({ super.key, this.activeRequestModel, }); final RequestModel? activeRequestModel; - @override - State createState() => _ResponseBodyState(); -} -class _ResponseBodyState extends State { @override Widget build(BuildContext context) { - final responseModel = widget.activeRequestModel?.responseModel; + final responseModel = activeRequestModel?.responseModel; if (responseModel == null) { return const ErrorMessage( message: @@ -348,7 +332,7 @@ class _ResponseBodyState extends State { } return BodySuccess( - key: Key("${widget.activeRequestModel!.id}-response"), + key: Key("${activeRequestModel!.id}-response"), mediaType: mediaType, options: options, bytes: responseModel.bodyBytes!, diff --git a/lib/widgets/tables.dart b/lib/widgets/tables.dart index 49d0021b..c238dae0 100644 --- a/lib/widgets/tables.dart +++ b/lib/widgets/tables.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:apidash/utils/utils.dart'; import 'package:apidash/consts.dart'; -class MapTable extends StatefulWidget { +class MapTable extends StatelessWidget { const MapTable( {super.key, required this.map, @@ -13,11 +13,6 @@ class MapTable extends StatefulWidget { final List colNames; final bool firstColumnHeaderCase; - @override - State createState() => _MapTableState(); -} - -class _MapTableState extends State { @override Widget build(BuildContext context) { return Table( @@ -33,7 +28,7 @@ class _MapTableState extends State { defaultVerticalAlignment: TableCellVerticalAlignment.middle, children: [ TableRow( - children: widget.colNames + children: colNames .map( (e) => TableCell( verticalAlignment: TableCellVerticalAlignment.top, @@ -51,7 +46,7 @@ class _MapTableState extends State { ) .toList(), ), - ...widget.map.entries.map( + ...map.entries.map( (entry) => TableRow( children: [ TableCell( @@ -59,7 +54,7 @@ class _MapTableState extends State { child: Padding( padding: kP1, child: SelectableText( - widget.firstColumnHeaderCase + firstColumnHeaderCase ? formatHeaderCase(entry.key) : entry.key, style: kCodeStyle.copyWith( diff --git a/lib/widgets/textfields.dart b/lib/widgets/textfields.dart index ff7b7313..76d1a9dc 100644 --- a/lib/widgets/textfields.dart +++ b/lib/widgets/textfields.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; -class URLField extends StatefulWidget { +class URLField extends StatelessWidget { const URLField({ super.key, required this.activeId, @@ -13,21 +13,11 @@ class URLField extends StatefulWidget { final String? initialValue; final void Function(String)? onChanged; - @override - State createState() => _URLFieldState(); -} - -class _URLFieldState extends State { - @override - void initState() { - super.initState(); - } - @override Widget build(BuildContext context) { return TextFormField( - key: Key("url-${widget.activeId}"), - initialValue: widget.initialValue, + key: Key("url-$activeId"), + initialValue: initialValue, style: kCodeStyle, decoration: InputDecoration( hintText: kHintTextUrlCard, @@ -38,12 +28,12 @@ class _URLFieldState extends State { ), border: InputBorder.none, ), - onChanged: widget.onChanged, + onChanged: onChanged, ); } } -class CellField extends StatefulWidget { +class CellField extends StatelessWidget { const CellField({ super.key, required this.keyId, @@ -59,41 +49,36 @@ class CellField extends StatefulWidget { final void Function(String)? onChanged; final ColorScheme? colorScheme; - @override - State createState() => _CellFieldState(); -} - -class _CellFieldState extends State { @override Widget build(BuildContext context) { - var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme; + var clrScheme = colorScheme ?? Theme.of(context).colorScheme; return TextFormField( - key: Key(widget.keyId), - initialValue: widget.initialValue, + key: Key(keyId), + initialValue: initialValue, style: kCodeStyle.copyWith( - color: colorScheme.onSurface, + color: clrScheme.onSurface, ), decoration: InputDecoration( hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity( + color: clrScheme.outline.withOpacity( kHintOpacity, ), ), - hintText: widget.hintText, + hintText: hintText, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( - color: colorScheme.primary.withOpacity( + color: clrScheme.primary.withOpacity( kHintOpacity, ), ), ), enabledBorder: UnderlineInputBorder( borderSide: BorderSide( - color: colorScheme.surfaceVariant, + color: clrScheme.surfaceVariant, ), ), ), - onChanged: widget.onChanged, + onChanged: onChanged, ); } } diff --git a/lib/widgets/texts.dart b/lib/widgets/texts.dart index 861574d7..f2cf5c92 100644 --- a/lib/widgets/texts.dart +++ b/lib/widgets/texts.dart @@ -12,10 +12,14 @@ class MethodBox extends StatelessWidget { if (method == HTTPVerb.delete) { text = "DEL"; } + if (method == HTTPVerb.patch) { + text = "PAT"; + } return SizedBox( - width: 28, + width: 24, child: Text( text, + textAlign: TextAlign.center, style: TextStyle( fontSize: 8, fontWeight: FontWeight.bold,