diff --git a/lib/src/tiles/platforms/ios_settings_tile.dart b/lib/src/tiles/platforms/ios_settings_tile.dart index c86f350..8d0cbd2 100644 --- a/lib/src/tiles/platforms/ios_settings_tile.dart +++ b/lib/src/tiles/platforms/ios_settings_tile.dart @@ -7,6 +7,7 @@ class IOSSettingsTile extends StatefulWidget { required this.tileType, required this.leading, required this.title, + required this.titleDescription, required this.description, required this.onPressed, required this.onToggle, @@ -15,12 +16,16 @@ class IOSSettingsTile extends StatefulWidget { required this.activeSwitchColor, required this.enabled, required this.trailing, - Key? key, - }) : super(key: key); + this.titlePadding, + this.leadingPadding, + this.titleDescriptionPadding, + super.key, + }); final SettingsTileType tileType; final Widget? leading; final Widget? title; + final Widget? titleDescription; final Widget? description; final Function(BuildContext context)? onPressed; final Function(bool value)? onToggle; @@ -29,12 +34,15 @@ class IOSSettingsTile extends StatefulWidget { final bool enabled; final Color? activeSwitchColor; final Widget? trailing; + final EdgeInsetsGeometry? titlePadding; + final EdgeInsetsGeometry? leadingPadding; + final EdgeInsetsGeometry? titleDescriptionPadding; @override - _IOSSettingsTileState createState() => _IOSSettingsTileState(); + IOSSettingsTileState createState() => IOSSettingsTileState(); } -class _IOSSettingsTileState extends State { +class IOSSettingsTileState extends State { bool isPressed = false; @override @@ -79,10 +87,10 @@ class _IOSSettingsTileState extends State { return ClipRRect( borderRadius: BorderRadius.vertical( top: additionalInfo.enableTopBorderRadius - ? Radius.circular(12) + ? const Radius.circular(12) : Radius.zero, bottom: additionalInfo.enableBottomBorderRadius - ? Radius.circular(12) + ? const Radius.circular(12) : Radius.zero, ), child: content, @@ -123,41 +131,62 @@ class _IOSSettingsTileState extends State { }) { final scaleFactor = MediaQuery.of(context).textScaleFactor; - return Row( - children: [ - if (widget.trailing != null) widget.trailing!, - if (widget.tileType == SettingsTileType.switchTile) - CupertinoSwitch( - value: widget.initialValue ?? true, - onChanged: widget.onToggle, - activeColor: widget.enabled - ? widget.activeSwitchColor - : theme.themeData.inactiveTitleColor, - ), - if (widget.tileType == SettingsTileType.navigationTile && - widget.value != null) - DefaultTextStyle( - style: TextStyle( - color: widget.enabled - ? theme.themeData.trailingTextColor + final isShowValue = widget.tileType == SettingsTileType.navigationTile && + widget.value != null; + + return Flexible( + flex: isShowValue ? 1 : 0, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + if (widget.trailing != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: IconTheme( + data: IconTheme.of(context).copyWith( + color: widget.enabled + ? theme.themeData.leadingIconsColor + : theme.themeData.inactiveTitleColor, + ), + child: widget.trailing!, + ), + ), + if (widget.tileType == SettingsTileType.switchTile) + CupertinoSwitch( + value: widget.initialValue ?? true, + onChanged: widget.onToggle, + activeColor: widget.enabled + ? widget.activeSwitchColor : theme.themeData.inactiveTitleColor, - fontSize: 17, ), - child: widget.value!, - ), - if (widget.tileType == SettingsTileType.navigationTile) - Padding( - padding: const EdgeInsetsDirectional.only(start: 6, end: 2), - child: IconTheme( - data: IconTheme.of(context) - .copyWith(color: theme.themeData.leadingIconsColor), - child: Icon( - CupertinoIcons.chevron_forward, - size: 18 * scaleFactor, + if (isShowValue) + Expanded( + child: DefaultTextStyle( + style: TextStyle( + color: widget.enabled + ? theme.themeData.trailingTextColor + : theme.themeData.inactiveTitleColor, + fontSize: 17, + ), + child: widget.value!, ), ), - ), - ], + if (widget.tileType == SettingsTileType.navigationTile) + Padding( + padding: const EdgeInsetsDirectional.only(start: 6, end: 2), + child: IconTheme( + data: IconTheme.of(context) + .copyWith(color: theme.themeData.leadingIconsColor), + child: Icon( + PlatformUtils.languageIsRTL(context) + ? CupertinoIcons.chevron_back + : CupertinoIcons.chevron_forward, + size: 18 * scaleFactor, + ), + ), + ), + ], + ), ); } @@ -186,7 +215,7 @@ class _IOSSettingsTileState extends State { widget.onPressed!.call(context); Future.delayed( - Duration(milliseconds: 100), + const Duration(milliseconds: 100), () => changePressState(isPressed: false), ); }, @@ -200,12 +229,13 @@ class _IOSSettingsTileState extends State { color: isPressed ? theme.themeData.tileHighlightColor : theme.themeData.settingsSectionBackground, - padding: EdgeInsetsDirectional.only(start: 18), + padding: const EdgeInsetsDirectional.only(start: 18), child: Row( children: [ if (widget.leading != null) Padding( - padding: const EdgeInsetsDirectional.only(end: 12.0), + padding: widget.leadingPadding ?? + const EdgeInsetsDirectional.only(end: 12.0), child: IconTheme.merge( data: IconThemeData( color: widget.enabled @@ -225,20 +255,44 @@ class _IOSSettingsTileState extends State { child: Row( children: [ Expanded( - child: Padding( - padding: EdgeInsetsDirectional.only( - top: 12.5 * scaleFactor, - bottom: 12.5 * scaleFactor, - ), - child: DefaultTextStyle( - style: TextStyle( - color: widget.enabled - ? theme.themeData.settingsTileTextColor - : theme.themeData.inactiveTitleColor, - fontSize: 16, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: widget.titlePadding ?? + EdgeInsetsDirectional.only( + top: 12.5 * scaleFactor, + bottom: widget.titleDescription == null + ? (12.5 * scaleFactor) + : (3.5 * scaleFactor), + ), + child: DefaultTextStyle( + style: TextStyle( + color: widget.enabled + ? theme.themeData.settingsTileTextColor + : theme.themeData.inactiveTitleColor, + fontSize: 16, + ), + child: widget.title!, + ), ), - child: widget.title!, - ), + if (widget.titleDescription != null) + Padding( + padding: widget.titleDescriptionPadding ?? + EdgeInsetsDirectional.only( + bottom: 12.5 * scaleFactor, + ), + child: DefaultTextStyle( + style: TextStyle( + color: widget.enabled + ? theme.themeData.titleTextColor + : theme.themeData.inactiveTitleColor, + fontSize: 15, + ), + child: widget.titleDescription!, + ), + ), + ], ), ), buildTrailing(context: context, theme: theme), @@ -267,22 +321,23 @@ class IOSSettingsTileAdditionalInfo extends InheritedWidget { final bool enableTopBorderRadius; final bool enableBottomBorderRadius; - IOSSettingsTileAdditionalInfo({ + const IOSSettingsTileAdditionalInfo({ + Key? key, required this.needToShowDivider, required this.enableTopBorderRadius, required this.enableBottomBorderRadius, required Widget child, - }) : super(child: child); + }) : super(key: key, child: child); @override - bool updateShouldNotify(IOSSettingsTileAdditionalInfo old) => true; + bool updateShouldNotify(IOSSettingsTileAdditionalInfo oldWidget) => true; static IOSSettingsTileAdditionalInfo of(BuildContext context) { final IOSSettingsTileAdditionalInfo? result = context .dependOnInheritedWidgetOfExactType(); // assert(result != null, 'No IOSSettingsTileAdditionalInfo found in context'); return result ?? - IOSSettingsTileAdditionalInfo( + const IOSSettingsTileAdditionalInfo( needToShowDivider: true, enableBottomBorderRadius: true, enableTopBorderRadius: true, diff --git a/lib/src/utils/platform_utils.dart b/lib/src/utils/platform_utils.dart index 826b7ad..f908c17 100644 --- a/lib/src/utils/platform_utils.dart +++ b/lib/src/utils/platform_utils.dart @@ -48,4 +48,23 @@ class PlatformUtils { return DevicePlatform.windows; } } +static bool languageIsRTL(BuildContext context) { + const rtlLanguages = [ + "ar", + "arc", + "dv", + "fa", + "ha", + "he", + "khw", + "ks", + "ku", + "ps", + "ur", + "yi" + ]; + final language = Localizations.localeOf(context).languageCode.toLowerCase(); + + return rtlLanguages.contains(language); + } } diff --git a/pubspec.yaml b/pubspec.yaml index f8a4802..f76341a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,3 +16,10 @@ dev_dependencies: pedantic: ^1.11.1 flutter: +platforms: + android: + ios: + linux: + macos: + web: + windows: