|
|
@@ -0,0 +1,228 @@
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter/services.dart';
|
|
|
+import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
+import 'package:keyboard/base/base_view.dart';
|
|
|
+import 'package:keyboard/module/intimacy_analyse/intimacy_analyse_upload/dialog/direction/custom_direction_edit_controller.dart';
|
|
|
+import 'package:keyboard/resource/assets.gen.dart';
|
|
|
+import 'package:keyboard/resource/colors.gen.dart';
|
|
|
+
|
|
|
+import '../../../../../resource/string.gen.dart';
|
|
|
+
|
|
|
+/// 保存时回调
|
|
|
+typedef OnSaveCallback = void Function(String customDirection);
|
|
|
+
|
|
|
+/// 关闭弹窗时回调
|
|
|
+typedef OnCloseCallback = void Function();
|
|
|
+
|
|
|
+/// 自定义预测方向的编辑弹窗的内容
|
|
|
+class CustomDirectionEditView extends BaseView<CustomDirectionEditController> {
|
|
|
+ final OnSaveCallback onSaveCallback;
|
|
|
+ final OnCloseCallback onCloseCallback;
|
|
|
+
|
|
|
+ const CustomDirectionEditView({
|
|
|
+ super.key,
|
|
|
+ required this.onSaveCallback,
|
|
|
+ required this.onCloseCallback,
|
|
|
+ });
|
|
|
+
|
|
|
+ @override
|
|
|
+ backgroundColor() => Colors.transparent;
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget buildBody(BuildContext context) {
|
|
|
+ return DelegateLifecycleWidget(
|
|
|
+ onCreateCallback: () {
|
|
|
+ // 进入页面,就获取输入框焦点
|
|
|
+ controller.doRequestInputFocus();
|
|
|
+ },
|
|
|
+ child: 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),
|
|
|
+ // 输入框
|
|
|
+ _buildInput(),
|
|
|
+ SizedBox(height: 24.h),
|
|
|
+ _buildSaveBtn(),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ top: 0,
|
|
|
+ right: 0,
|
|
|
+ child: InkWell(
|
|
|
+ onTap: () {
|
|
|
+ controller.doClose(onCloseCallback);
|
|
|
+ },
|
|
|
+ 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.intimacyAnalyseAddPredictionDirection,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 16.sp,
|
|
|
+ color: ColorName.black80,
|
|
|
+ fontWeight: FontWeight.bold,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 输入框
|
|
|
+ Widget _buildInput() {
|
|
|
+ return TextField(
|
|
|
+ // 点击输入框外部,关闭软键盘
|
|
|
+ onTapUpOutside: (event) {
|
|
|
+ controller.doInputUnFocus();
|
|
|
+ },
|
|
|
+ // 焦点控制
|
|
|
+ focusNode: controller.inputFocusNode,
|
|
|
+ // 输入框控制
|
|
|
+ controller: controller.editingController,
|
|
|
+ inputFormatters: [
|
|
|
+ // 限定最大字符长度
|
|
|
+ LengthLimitingTextInputFormatter(
|
|
|
+ controller.getMaxCustomDirectionWords(),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ // 文字居中显示
|
|
|
+ textAlign: TextAlign.center,
|
|
|
+ // 单行
|
|
|
+ maxLines: 1,
|
|
|
+ // 设置光标颜色
|
|
|
+ cursorColor: ColorName.inputCursor,
|
|
|
+ // 光标宽度
|
|
|
+ cursorWidth: 2.w,
|
|
|
+ // 光标圆角
|
|
|
+ cursorRadius: Radius.circular(2.r),
|
|
|
+ // 输入框的边框样式
|
|
|
+ decoration: InputDecoration(
|
|
|
+ // 启用背景填充,背景才会生效
|
|
|
+ filled: true,
|
|
|
+ // 设置背景颜色
|
|
|
+ fillColor: Color(0xFFF6F5FA),
|
|
|
+ // 调整内边距
|
|
|
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
|
|
+ // 设置边框样式
|
|
|
+ border: OutlineInputBorder(
|
|
|
+ // 圆角半径
|
|
|
+ borderRadius: BorderRadius.circular(31.0),
|
|
|
+ // 隐藏边框线
|
|
|
+ borderSide: BorderSide.none,
|
|
|
+ ),
|
|
|
+ // 未输入时的提示文字
|
|
|
+ hintText: StringName.inputCommonHint,
|
|
|
+ hintStyle: TextStyle(
|
|
|
+ color: Colors.black45,
|
|
|
+ fontSize: 14.sp,
|
|
|
+ fontWeight: FontWeight.w400,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ style: TextStyle(
|
|
|
+ color: ColorName.black80,
|
|
|
+ fontSize: 14.sp,
|
|
|
+ fontWeight: FontWeight.w400,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 保存按钮
|
|
|
+ Widget _buildSaveBtn() {
|
|
|
+ return GestureDetector(
|
|
|
+ onTap: () {
|
|
|
+ controller.doOnSave(onSaveCallback);
|
|
|
+ },
|
|
|
+ child: Container(
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 14.h),
|
|
|
+ width: double.maxFinite,
|
|
|
+ decoration: ShapeDecoration(
|
|
|
+ // 渐变背景
|
|
|
+ gradient: LinearGradient(
|
|
|
+ colors: [ColorName.purpleGradient3, ColorName.purpleGradient4],
|
|
|
+ begin: Alignment.centerLeft,
|
|
|
+ end: Alignment.centerRight,
|
|
|
+ ),
|
|
|
+ shape: RoundedRectangleBorder(
|
|
|
+ borderRadius: BorderRadius.circular(50.r),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ child: Center(
|
|
|
+ child: Text(
|
|
|
+ StringName.save,
|
|
|
+ style: TextStyle(
|
|
|
+ color: ColorName.white,
|
|
|
+ fontSize: 16.sp,
|
|
|
+ fontWeight: FontWeight.w500,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/// 由于Getx的Controller用了单例,导致无法监听到组件的生命周期,所以用一个StatefulWidget来获取Widget的生命周期
|
|
|
+class DelegateLifecycleWidget extends StatefulWidget {
|
|
|
+ final Widget child;
|
|
|
+
|
|
|
+ final Function? onCreateCallback;
|
|
|
+ final Function? onDestroyCallback;
|
|
|
+
|
|
|
+ const DelegateLifecycleWidget({
|
|
|
+ super.key,
|
|
|
+ required this.child,
|
|
|
+ this.onCreateCallback,
|
|
|
+ this.onDestroyCallback,
|
|
|
+ });
|
|
|
+
|
|
|
+ @override
|
|
|
+ State<StatefulWidget> createState() {
|
|
|
+ return _DelegateLifecycleWidgetState();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _DelegateLifecycleWidgetState extends State<DelegateLifecycleWidget> {
|
|
|
+ @override
|
|
|
+ void initState() {
|
|
|
+ super.initState();
|
|
|
+ if (widget.onCreateCallback != null) {
|
|
|
+ widget.onCreateCallback!();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void dispose() {
|
|
|
+ if (widget.onDestroyCallback != null) {
|
|
|
+ widget.onDestroyCallback!();
|
|
|
+ }
|
|
|
+ super.dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return widget.child;
|
|
|
+ }
|
|
|
+}
|