浏览代码

[feat]档案编辑,增加删除档案功能

hezihao 6 月之前
父节点
当前提交
a416a94a46

二进制
assets/images/icon_profile_delete.webp


+ 3 - 0
assets/string/base/string.xml

@@ -478,4 +478,7 @@
     <string name="zodiac_love_intimacy_vip_unlock_tip">VIP免费看下周星座关系分析</string>
     <string name="zodiac_love_intimacy_today_tab">今日指数</string>
     <string name="zodiac_love_intimacy_future_week_tab">未来一周</string>
+
+    <string name="dialog_cancel">取消</string>
+    <string name="dialog_confirm">确定</string>
 </resources>

+ 7 - 3
lib/data/api/atmob_api.dart

@@ -21,6 +21,7 @@ import 'package:keyboard/data/api/request/keyboard_character_list_request.dart';
 import 'package:keyboard/data/api/request/keyboard_character_start_request.dart';
 import 'package:keyboard/data/api/request/keyboard_character_update_request.dart';
 import 'package:keyboard/data/api/request/keyboard_choose_request.dart';
+import 'package:keyboard/data/api/request/keyboard_delete_request.dart';
 import 'package:keyboard/data/api/request/keyboard_generate_request.dart';
 import 'package:keyboard/data/api/request/keyboard_list_request.dart';
 import 'package:keyboard/data/api/request/keyboard_meme_explain_request.dart';
@@ -215,6 +216,10 @@ abstract class AtmobApi {
     @Body() KeyboardGenerateRequest request,
   );
 
+  /// 删除键盘(档案)
+  @POST("/project/keyboard/v1/keyboard/delete")
+  Future<BaseResponse> keyboardDelete(@Body() KeyboardDeleteRequest request);
+
   // 获取键盘列表
   @POST("/project/keyboard/v1/keyboard/list")
   Future<BaseResponse<KeyboardListResponse>> getKeyboardList(
@@ -329,9 +334,8 @@ abstract class AtmobApi {
 
   /// 获取星座恋爱分析-基本信息
   @POST("/project/keyboard/v1/intimacy/love/info")
-  Future<BaseResponse<ZodiacLoveIntimacyLoveInfoResponse>> getZodiacLoveIntimacyLoveInfo(
-    @Body() AppBaseRequest request,
-  );
+  Future<BaseResponse<ZodiacLoveIntimacyLoveInfoResponse>>
+  getZodiacLoveIntimacyLoveInfo(@Body() AppBaseRequest request);
 
   /// 星座恋爱分析-获取今日指数分析
   @POST("/project/keyboard/v1/intimacy/today/index")

+ 33 - 0
lib/data/api/atmob_api.g.dart

@@ -837,6 +837,39 @@ class _AtmobApi implements AtmobApi {
   }
 
   @override
+  Future<BaseResponse<dynamic>> keyboardDelete(
+    KeyboardDeleteRequest request,
+  ) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options = _setStreamType<BaseResponse<dynamic>>(
+      Options(method: 'POST', headers: _headers, extra: _extra)
+          .compose(
+            _dio.options,
+            '/project/keyboard/v1/keyboard/delete',
+            queryParameters: queryParameters,
+            data: _data,
+          )
+          .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+    );
+    final _result = await _dio.fetch<Map<String, dynamic>>(_options);
+    late BaseResponse<dynamic> _value;
+    try {
+      _value = BaseResponse<dynamic>.fromJson(
+        _result.data!,
+        (json) => json as dynamic,
+      );
+    } on Object catch (e, s) {
+      errorLogger?.logError(e, s, _options);
+      rethrow;
+    }
+    return _value;
+  }
+
+  @override
   Future<BaseResponse<KeyboardListResponse>> getKeyboardList(
     KeyboardListRequest request,
   ) async {

+ 17 - 0
lib/data/api/request/keyboard_delete_request.dart

@@ -0,0 +1,17 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../../base/app_base_request.dart';
+
+part 'keyboard_delete_request.g.dart';
+
+/// 删除键盘(档案)
+@JsonSerializable()
+class KeyboardDeleteRequest extends AppBaseRequest {
+  @JsonKey(name: "keyboardId")
+  String keyboardId;
+
+  KeyboardDeleteRequest({required this.keyboardId});
+
+  @override
+  Map<String, dynamic> toJson() => _$KeyboardDeleteRequestToJson(this);
+}

+ 70 - 0
lib/data/api/request/keyboard_delete_request.g.dart

@@ -0,0 +1,70 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'keyboard_delete_request.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+KeyboardDeleteRequest _$KeyboardDeleteRequestFromJson(
+  Map<String, dynamic> json,
+) =>
+    KeyboardDeleteRequest(keyboardId: json['keyboardId'] as String)
+      ..appPlatform = (json['appPlatform'] as num).toInt()
+      ..os = json['os'] as String
+      ..osVersion = json['osVersion'] as String
+      ..packageName = json['packageName'] as String?
+      ..appVersionName = json['appVersionName'] as String?
+      ..appVersionCode = (json['appVersionCode'] as num?)?.toInt()
+      ..channelName = json['channelName'] as String?
+      ..appId = (json['appId'] as num?)?.toInt()
+      ..tgPlatform = (json['tgPlatform'] as num?)?.toInt()
+      ..oaid = json['oaid'] as String?
+      ..aaid = json['aaid'] as String?
+      ..androidId = json['androidId'] as String?
+      ..imei = json['imei'] as String?
+      ..simImei0 = json['simImei0'] as String?
+      ..simImei1 = json['simImei1'] as String?
+      ..mac = json['mac'] as String?
+      ..idfa = json['idfa'] as String?
+      ..idfv = json['idfv'] as String?
+      ..machineId = json['machineId'] as String?
+      ..brand = json['brand'] as String?
+      ..model = json['model'] as String?
+      ..wifiName = json['wifiName'] as String?
+      ..region = json['region'] as String?
+      ..locLng = (json['locLng'] as num?)?.toDouble()
+      ..locLat = (json['locLat'] as num?)?.toDouble()
+      ..authToken = json['authToken'] as String?;
+
+Map<String, dynamic> _$KeyboardDeleteRequestToJson(
+  KeyboardDeleteRequest instance,
+) => <String, dynamic>{
+  'appPlatform': instance.appPlatform,
+  'os': instance.os,
+  'osVersion': instance.osVersion,
+  'packageName': instance.packageName,
+  'appVersionName': instance.appVersionName,
+  'appVersionCode': instance.appVersionCode,
+  'channelName': instance.channelName,
+  'appId': instance.appId,
+  'tgPlatform': instance.tgPlatform,
+  'oaid': instance.oaid,
+  'aaid': instance.aaid,
+  'androidId': instance.androidId,
+  'imei': instance.imei,
+  'simImei0': instance.simImei0,
+  'simImei1': instance.simImei1,
+  'mac': instance.mac,
+  'idfa': instance.idfa,
+  'idfv': instance.idfv,
+  'machineId': instance.machineId,
+  'brand': instance.brand,
+  'model': instance.model,
+  'wifiName': instance.wifiName,
+  'region': instance.region,
+  'locLng': instance.locLng,
+  'locLat': instance.locLat,
+  'authToken': instance.authToken,
+  'keyboardId': instance.keyboardId,
+};

+ 7 - 1
lib/data/repository/keyboard_repository.dart

@@ -10,6 +10,7 @@ import 'package:keyboard/data/api/response/keyboard_meme_explain_response.dart';
 import 'package:keyboard/data/api/response/keyboard_prologue_list_response.dart';
 import 'package:keyboard/utils/atmob_log.dart';
 import 'dart:convert';
+import '../../base/base_response.dart';
 import '../../di/get_it.dart';
 import '../../module/keyboard_manage/keyboard_manage_controller.dart';
 import '../../utils/async_util.dart';
@@ -18,6 +19,7 @@ import '../api/atmob_api.dart';
 import '../api/request/keyboard_character_list_request.dart';
 import '../api/request/keyboard_character_start_request.dart';
 import '../api/request/keyboard_choose_request.dart';
+import '../api/request/keyboard_delete_request.dart';
 import '../api/request/keyboard_meme_explain_request.dart';
 import '../api/request/keyboard_update_request.dart';
 import '../api/response/keyboard_character_list_response.dart';
@@ -102,7 +104,6 @@ class KeyboardRepository {
     );
   }
 
-
   Future refreshKeyboardList() async {
     return getKeyboardList().then((response) {
       _keyboardInfoList.value = response.keyboardInfos;
@@ -250,6 +251,11 @@ class KeyboardRepository {
         });
   }
 
+  /// 删除键盘(档案)
+  Future<void> keyboardDelete(KeyboardDeleteRequest request) {
+    return atmobApi.keyboardDelete(request).then(HttpHandler.handle(true));
+  }
+
   Future<KeyboardMemeExplainResponse> getKeyboardMemeExplain({
     required String birthday,
     required String targetBirthday,

+ 5 - 0
lib/di/get_it.config.dart

@@ -87,6 +87,8 @@ import '../module/main/main_controller.dart' as _i731;
 import '../module/mine/mine_controller.dart' as _i732;
 import '../module/new_user/new_user_controller.dart' as _i701;
 import '../module/new_user/result/new_user_result_controller.dart' as _i576;
+import '../module/profile/dialog/delete_profile_confirm_controller.dart'
+    as _i232;
 import '../module/profile/edit/profile_edit_controller.dart' as _i344;
 import '../module/profile/profile_controller.dart' as _i244;
 import '../module/splash/splash_controller.dart' as _i973;
@@ -166,6 +168,9 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i415.KeyboardMethodHandler>(
       () => _i415.KeyboardMethodHandler(),
     );
+    gh.factory<_i232.DeleteProfileConfirmController>(
+      () => _i232.DeleteProfileConfirmController(),
+    );
     gh.lazySingleton<_i495.WechatLoginService>(
       () => _i495.WechatLoginService(),
     );

+ 17 - 0
lib/module/profile/dialog/delete_profile_confirm_controller.dart

@@ -0,0 +1,17 @@
+import 'package:injectable/injectable.dart';
+import 'package:keyboard/base/base_controller.dart';
+import 'package:keyboard/module/profile/dialog/delete_profile_confirm_dialog.dart';
+
+/// 删除档案弹窗Controller
+@injectable
+class DeleteProfileConfirmController extends BaseController {
+  /// 确认
+  void doOnConfirm(OnConfirmCallback onConfirmCallback) {
+    onConfirmCallback();
+  }
+
+  /// 取消
+  void doOnCancel(OnCancelCallback onCancelCallback) {
+    onCancelCallback();
+  }
+}

+ 171 - 0
lib/module/profile/dialog/delete_profile_confirm_dialog.dart

@@ -0,0 +1,171 @@
+import 'package:flutter/Material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+
+import '../../../base/base_view.dart';
+import '../../../resource/assets.gen.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import '../../../widget/gradient_btn.dart';
+import 'delete_profile_confirm_controller.dart';
+
+/// 确定时回调
+typedef OnConfirmCallback = void Function();
+
+/// 取消时回调
+typedef OnCancelCallback = void Function();
+
+/// 删除档案弹窗
+class DeleteProfileConfirmDialog {
+  static const String _tag = "DeleteProfileConfirmDialog";
+
+  /// 显示弹窗
+  /// [targetName] Ta的名称
+  /// [onConfirmCallback] 确认时回调
+  static void show(String targetName, OnConfirmCallback onConfirmCallback) {
+    SmartDialog.show(
+      tag: _tag,
+      // 点击遮罩,不关闭弹窗
+      clickMaskDismiss: false,
+      // 内容居中显示
+      alignment: Alignment.center,
+      // 动画类型
+      animationType: SmartAnimationType.fade,
+      builder:
+          (BuildContext context) => IntrinsicHeight(
+            child: Container(
+              padding: EdgeInsets.symmetric(horizontal: 32.w),
+              child: DeleteProfileConfirmView(
+                targetName: targetName,
+                onConfirmCallback: () {
+                  onConfirmCallback();
+                  SmartDialog.dismiss(tag: _tag);
+                },
+                onCancelCallback: () {
+                  // 关闭弹窗
+                  SmartDialog.dismiss(tag: _tag);
+                },
+              ),
+            ),
+          ),
+    );
+  }
+}
+
+/// 删除档案弹窗的内容
+class DeleteProfileConfirmView
+    extends BaseView<DeleteProfileConfirmController> {
+  final String targetName;
+
+  final OnConfirmCallback onConfirmCallback;
+  final OnCancelCallback onCancelCallback;
+
+  const DeleteProfileConfirmView({
+    super.key,
+    required this.targetName,
+    required this.onConfirmCallback,
+    required this.onCancelCallback,
+  });
+
+  @override
+  backgroundColor() => Colors.transparent;
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Stack(
+      children: [
+        Container(
+          padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+          decoration: BoxDecoration(
+            color: ColorName.white,
+            borderRadius: BorderRadius.all(Radius.circular(16.r)),
+          ),
+          child: Column(
+            // 包裹内容
+            mainAxisSize: MainAxisSize.min,
+            children: [
+              // 标题
+              _buildTitle(),
+              SizedBox(height: 16.h),
+              // 内容
+              _buildContent(),
+              SizedBox(height: 20.h),
+              // 操作按钮
+              _buildActionBtn(),
+            ],
+          ),
+        ),
+        Positioned(
+          top: 0,
+          right: 0,
+          child: InkWell(
+            onTap: () {
+              controller.doOnCancel(onCancelCallback);
+            },
+            splashColor: ColorName.transparent,
+            child: Container(
+              padding: EdgeInsets.all(14.w),
+              child: Assets.images.iconCustomDirectionEditClose.image(
+                width: 24.w,
+                height: 24.w,
+              ),
+            ),
+          ),
+        ),
+      ],
+    );
+  }
+
+  /// 标题
+  Widget _buildTitle() {
+    return Text(
+      StringName.tipsDialogTitle,
+      style: TextStyle(
+        fontSize: 16.sp,
+        color: ColorName.black80,
+        fontWeight: FontWeight.bold,
+      ),
+    );
+  }
+
+  /// 输入框
+  Widget _buildContent() {
+    return Text(
+      "确定要删除  $targetName  的档案吗?",
+      style: TextStyle(
+        fontSize: 14.sp,
+        color: ColorName.black80,
+        fontWeight: FontWeight.w400,
+      ),
+    );
+  }
+
+  /// 操作按钮
+  Widget _buildActionBtn() {
+    return Row(
+      children: [
+        // 取消
+        Expanded(
+          child: GradientTextBtn(
+            StringName.dialogCancel,
+            color: Color(0xFFF6F5FA),
+            textColor: ColorName.black60,
+            onPressed: () {
+              controller.doOnCancel(onConfirmCallback);
+            },
+          ),
+        ),
+        SizedBox(width: 8.w),
+        // 确定
+        Expanded(
+          child: GradientTextBtn(
+            StringName.dialogConfirm,
+            onPressed: () {
+              controller.doOnConfirm(onConfirmCallback);
+            },
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 20 - 7
lib/module/profile/edit/profile_edit_controller.dart

@@ -1,6 +1,7 @@
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:keyboard/base/base_controller.dart';
+import 'package:keyboard/data/api/request/keyboard_delete_request.dart';
 import 'package:keyboard/data/bean/default_avatar_info.dart';
 import 'package:keyboard/data/bean/keyboard_info.dart';
 import 'package:keyboard/data/repository/keyboard_repository.dart';
@@ -18,6 +19,7 @@ import '../../../utils/http_handler.dart';
 import '../../change/birthday/change_birthday_page.dart';
 import '../../change/nickname/change_nickname_page.dart';
 import '../../keyboard_manage/keyboard_manage_page.dart';
+import '../dialog/delete_profile_confirm_dialog.dart';
 
 enum ProfileEditMode {
   add, // 新增
@@ -41,11 +43,11 @@ class ProfileEditController extends BaseController {
   Rxn<DefaultAvatarInfo> get currentDefaultAvatarInfo =>
       configRepository.defaultAvatarInfo;
 
-  late final ProfileEditMode mode;
+  final Rxn<ProfileEditMode> mode = Rxn<ProfileEditMode>();
 
-  bool get isEditMode => mode == ProfileEditMode.edit;
+  bool get isEditMode => mode.value == ProfileEditMode.edit;
 
-  bool get isAddMode => mode == ProfileEditMode.add;
+  bool get isAddMode => mode.value == ProfileEditMode.add;
 
   final Rx<KeyboardInfo> _currentCustomKeyboardInfo = KeyboardInfo().obs;
 
@@ -88,7 +90,7 @@ class ProfileEditController extends BaseController {
     super.onInit();
     final KeyboardInfo? keyboardInfo = Get.arguments?["keyboardInfo"];
     if (keyboardInfo != null) {
-      mode = ProfileEditMode.edit;
+      mode.value = ProfileEditMode.edit;
       _currentCustomKeyboardInfo.value = keyboardInfo;
       _currentNickname.value = keyboardInfo.name;
       _currentGender.value = keyboardInfo.gender;
@@ -97,7 +99,7 @@ class ProfileEditController extends BaseController {
       _avatarUrl.value = keyboardInfo.imageUrl ?? "";
       getKeyboardCharacterList(keyboardId: keyboardInfo.id!);
     } else {
-      mode = ProfileEditMode.add;
+      mode.value = ProfileEditMode.add;
       _currentGender.value = null;
       _currentCustomIntimacy.value = 30;
       _avatarUrl.value = "";
@@ -166,6 +168,18 @@ class ProfileEditController extends BaseController {
     Get.back();
   }
 
+  /// 删除档案
+  clickDelete() {
+    DeleteProfileConfirmDialog.show(_currentNickname.value ?? "", () async {
+      var keyboardId = _currentCustomKeyboardInfo.value.id ?? "";
+      // 发起删除
+      await keyboardRepository.keyboardDelete(
+        KeyboardDeleteRequest(keyboardId: keyboardId),
+      );
+      Get.back(result: true);
+    });
+  }
+
   void clickNickname() async {
     AtmobLog.d(tag, 'clickNickname');
     final result = await ChangeNicknamePage.start(
@@ -275,10 +289,9 @@ class ProfileEditController extends BaseController {
 
   void _handleError(dynamic error) {
     if (error is ServerErrorException) {
-      ErrorHandler.toastError(error,message: error.message);
+      ErrorHandler.toastError(error, message: error.message);
       AtmobLog.d(tag, 'clickSaveButton error: ${error.message}');
     } else {
-
       AtmobLog.d(tag, 'clickSaveButton error1: $error');
     }
   }

+ 33 - 5
lib/module/profile/edit/profile_edit_page.dart

@@ -118,11 +118,39 @@ class ProfileEditPage extends BasePage<ProfileEditController> {
 
   _buildTitle() {
     return Container(
-      alignment: Alignment.centerLeft,
-      padding: EdgeInsets.only(top: 12.h, left: 16.w),
-      child: GestureDetector(
-        onTap: controller.clickBack,
-        child: Assets.images.iconMineBackArrow.image(width: 24.w, height: 24.w),
+      margin: EdgeInsets.only(top: 12.h),
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+        children: [
+          GestureDetector(
+            onTap: controller.clickBack,
+            child: Padding(
+              padding: EdgeInsets.only(left: 16.w, right: 16.w),
+              child: Assets.images.iconMineBackArrow.image(
+                width: 24.w,
+                height: 24.w,
+              ),
+            ),
+          ),
+          // 删除
+          Obx(() {
+            // 编辑模式,才有删除按钮
+            var isEditMode = controller.isEditMode;
+            if (!isEditMode) {
+              return SizedBox.shrink();
+            }
+            return GestureDetector(
+              onTap: controller.clickDelete,
+              child: Padding(
+                padding: EdgeInsets.only(left: 16.w, right: 16.w),
+                child: Assets.images.iconProfileDelete.image(
+                  width: 24.w,
+                  height: 24.w,
+                ),
+              ),
+            );
+          }),
+        ],
       ),
     );
   }

+ 5 - 0
lib/resource/assets.gen.dart

@@ -1044,6 +1044,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconProfileAdd =>
       const AssetGenImage('assets/images/icon_profile_add.webp');
 
+  /// File path: assets/images/icon_profile_delete.webp
+  AssetGenImage get iconProfileDelete =>
+      const AssetGenImage('assets/images/icon_profile_delete.webp');
+
   /// File path: assets/images/icon_profile_edit.webp
   AssetGenImage get iconProfileEdit =>
       const AssetGenImage('assets/images/icon_profile_edit.webp');
@@ -1514,6 +1518,7 @@ class $AssetsImagesGen {
     iconPisces,
     iconPlay,
     iconProfileAdd,
+    iconProfileDelete,
     iconProfileEdit,
     iconProfileFemale,
     iconProfileKeyboardSelect,

+ 4 - 0
lib/resource/string.gen.dart

@@ -356,6 +356,8 @@ class StringName {
   static final String zodiacLoveIntimacyVipUnlockTip = 'zodiac_love_intimacy_vip_unlock_tip'.tr; // VIP免费看下周星座关系分析
   static final String zodiacLoveIntimacyTodayTab = 'zodiac_love_intimacy_today_tab'.tr; // 今日指数
   static final String zodiacLoveIntimacyFutureWeekTab = 'zodiac_love_intimacy_future_week_tab'.tr; // 未来一周
+  static final String dialogCancel = 'dialog_cancel'.tr; // 取消
+  static final String dialogConfirm = 'dialog_confirm'.tr; // 确定
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -715,6 +717,8 @@ class StringMultiSource {
       'zodiac_love_intimacy_vip_unlock_tip': 'VIP免费看下周星座关系分析',
       'zodiac_love_intimacy_today_tab': '今日指数',
       'zodiac_love_intimacy_future_week_tab': '未来一周',
+      'dialog_cancel': '取消',
+      'dialog_confirm': '确定',
     },
   };
 }

+ 3 - 0
lib/router/app_pages.dart

@@ -73,6 +73,7 @@ import '../module/login/login_page.dart';
 import '../module/main/main_controller.dart';
 import '../module/main/main_page.dart';
 import '../module/new_user/new_user_page.dart';
+import '../module/profile/dialog/delete_profile_confirm_controller.dart';
 import '../module/profile/edit/profile_edit_page.dart';
 import '../module/splash/splash_page.dart';
 import '../module/store/discount/discount_controller.dart';
@@ -201,6 +202,8 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<ZodiacLoveIntimacyController>());
     lazyPut(() => getIt.get<ZodiacLoveTodayController>());
     lazyPut(() => getIt.get<ZodiacLoveFutureWeekController>());
+
+    lazyPut(() => getIt.get<DeleteProfileConfirmController>());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {

+ 8 - 1
lib/widget/gradient_btn.dart

@@ -129,6 +129,9 @@ class GradientTextBtn extends StatelessWidget {
   /// 渐变颜色参数
   final List<Color> colors;
 
+  /// 文字颜色
+  final Color? textColor;
+
   /// 渐变方向
   final AlignmentGeometry begin;
   final AlignmentGeometry end;
@@ -151,6 +154,7 @@ class GradientTextBtn extends StatelessWidget {
     String? text,
     List<Color>? colors,
     Color? color,
+    Color? textColor,
     String? desc,
     double radius = 50,
     EdgeInsetsGeometry? padding = const EdgeInsets.symmetric(vertical: 14),
@@ -173,6 +177,7 @@ class GradientTextBtn extends StatelessWidget {
         btnText,
         desc: desc,
         colors: colors,
+        textColor: textColor,
         leftIcon: leftIcon,
         leftIconMargin: leftIconMargin,
         radius: radius,
@@ -185,6 +190,7 @@ class GradientTextBtn extends StatelessWidget {
         btnText,
         desc: desc,
         color: color ?? ColorName.colorBrand,
+        textColor: textColor,
         leftIcon: leftIcon,
         leftIconMargin: leftIconMargin,
         radius: radius,
@@ -203,6 +209,7 @@ class GradientTextBtn extends StatelessWidget {
     this.color,
     this.enable = true,
     this.colors = const [ColorName.purpleGradient3, ColorName.purpleGradient4],
+    this.textColor,
     this.begin = Alignment.centerLeft,
     this.end = Alignment.centerRight,
     this.radius = 50,
@@ -234,7 +241,7 @@ class GradientTextBtn extends StatelessWidget {
               Text(
                 text,
                 style: TextStyle(
-                  color: ColorName.white,
+                  color: textColor ?? ColorName.white,
                   fontSize: 16.sp,
                   fontWeight: FontWeight.bold,
                 ),