aslan-flutter/lib/chatvibe_features/family/create/create_family_page.dart
2026-07-01 18:25:58 +08:00

490 lines
24 KiB
Dart

import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_ui/components/appbar/chatvibe_appbar.dart';
import 'package:aslan/chatvibe_ui/components/at_debounce_widget.dart';
import 'package:aslan/chatvibe_ui/components/at_compontent.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:aslan/chatvibe_ui/components/at_tts.dart';
import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import 'package:aslan/chatvibe_core/utilities/at_loading_manager.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:provider/provider.dart';
import 'package:aslan/chatvibe_core/constants/at_screen.dart';
import 'package:aslan/chatvibe_core/utilities/at_pick_utils.dart';
import 'package:aslan/chatvibe_data/sources/repositories/family_repository_impl.dart';
import 'package:aslan/chatvibe_managers/user_profile_manager.dart';
import 'package:aslan/chatvibe_features/family/family_route.dart';
import '../../../chatvibe_data/models/enum/at_vip_type.dart';
import '../../../chatvibe_domain/usecases/at_accurate_length_limiting_textInput_formatter.dart';
import '../../../chatvibe_domain/usecases/at_custom_filtering_textinput_formatter.dart';
import '../../../chatvibe_domain/usecases/at_custom_filtering_textinput_formatter2.dart';
class CreateFamilyPage extends StatefulWidget {
@override
_CreateFamilyPageState createState() => _CreateFamilyPageState();
}
class _CreateFamilyPageState extends State<CreateFamilyPage> {
TextEditingController familyNameController = TextEditingController();
TextEditingController familyInfoController = TextEditingController();
final int _familyNameMaxLength = 24;
int _familyNameCurrentLength = 0;
String familyCover = "";
final int _familyInfoMaxLength = 80;
int _familyInfoCurrentLength = 0;
bool isFreeCreate = false;
@override
void initState() {
super.initState();
if (AccountStorage().getVIP()?.name == ATVIPType.DUKE.name ||
AccountStorage().getVIP()?.name == ATVIPType.KING.name ||
AccountStorage().getVIP()?.name == ATVIPType.EMPEROR.name) {
isFreeCreate = true;
}
familyNameController.addListener(() {
setState(() {
_familyNameCurrentLength = _getActualCharacterCount(
familyNameController.text,
);
});
});
familyInfoController.addListener(() {
setState(() {
_familyInfoCurrentLength = _getActualCharacterCount(
familyInfoController.text,
);
});
});
}
int _getActualCharacterCount(String text) {
return text.characters.length;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: true,
body: SafeArea(
top: false,
child: LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
child: Stack(
children: [
Image.asset(
"atu_images/family/at_icon_family_head_bg.png",
fit: BoxFit.fitWidth,
),
PositionedDirectional(
top: 11.w,
child: ChatVibeStandardAppBar(
actions: [],
title: "",
backButtonColor: Colors.white,
),
),
Container(
margin: EdgeInsets.only(top: 212.w),
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(12.w),
topRight: Radius.circular(12.w),
),
child: BackdropFilter(
filter: ui.ImageFilter.blur(sigmaX: 18, sigmaY: 18),
child: Container(
alignment: Alignment.center,
color: Colors.white10,
child: Column(
children: [
SizedBox(height: 15.w),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
ATAppLocalizations.of(context)!.createFamily,
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
),
],
),
SizedBox(height: 20.w),
ATDebounceWidget(
child: Stack(
alignment: Alignment.center,
children: [
Image.asset(
"atu_images/family/at_icon_create_family_camer.png",
height: 85.w,
),
familyCover.isNotEmpty
? netImage(
url: familyCover,
fit: BoxFit.cover,
borderRadius: BorderRadius.all(
Radius.circular(8.w),
),
width: 85.w,
height: 85.w,
)
: Container(),
],
),
onTap: () {
ATPickUtils.pickImageProcess(aspectRatio: 1, context, (
bool success,
String url,
) {
if (success) {
setState(() {
familyCover = url;
});
}
});
},
),
SizedBox(height: 10.w),
Row(
children: [
SizedBox(width: 10.w),
text(
"*",
textColor: Colors.red,
fontSize: 13.sp,
fontWeight: FontWeight.w600,
),
text(
"${ATAppLocalizations.of(context)!.familyName}:",
textColor: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w600,
),
],
),
SizedBox(height: 8.w),
Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
// 外部容器用于实现渐变边框
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
// 渐变色边框
gradient: LinearGradient(
colors: [
Color(0xffcecece), // 渐变色1
Color(0xff5b5b5b), // 渐变色2
Color(0xffcecece), // 渐变色3
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
// 内部留白(边框宽度)
padding: EdgeInsets.all(1.w), // 边框宽度
child: Container(
padding: EdgeInsets.only(
left: width(12),
right: width(12),
),
alignment: AlignmentDirectional.centerStart,
height: 45.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7.5.w),
// 比外圆角小边框宽度
color: Colors.black87, // 背景色
),
child: TextField(
controller: familyNameController,
onChanged: (text) {},
inputFormatters: [
ATCustomFilteringTextInputFormatter(),
ATAccurateLengthLimitingTextInputFormatter(
_familyNameMaxLength,
),
],
decoration: InputDecoration(
hintText:
ATAppLocalizations.of(
context,
)!.enterFamilyName,
hintStyle: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
contentPadding: EdgeInsets.only(top: 0.w),
counterText: '',
isDense: true,
filled: false,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
border: InputBorder.none,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
disabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
suffix: Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(width: 3.w),
text(
'$_familyNameCurrentLength/$_familyNameMaxLength',
textColor: Colors.white,
),
],
),
),
style: TextStyle(
fontSize: sp(14),
color: Colors.white,
textBaseline: TextBaseline.alphabetic,
),
),
),
),
SizedBox(height: 10.w),
Row(
children: [
SizedBox(width: 10.w),
text(
"${ATAppLocalizations.of(context)!.familyInfo}:",
textColor: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w600,
),
],
),
SizedBox(height: 8.w),
Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
// 外部容器用于实现渐变边框
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
// 渐变色边框
gradient: LinearGradient(
colors: [
Color(0xffcecece), // 渐变色1
Color(0xff5b5b5b), // 渐变色2
Color(0xffcecece), // 渐变色3
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
// 内部留白(边框宽度)
padding: EdgeInsets.all(1.w), // 边框宽度
child: Stack(
alignment: AlignmentDirectional.bottomEnd,
children: [
Container(
padding: EdgeInsets.only(
top: width(12),
left: width(12),
right: width(12),
),
alignment: AlignmentDirectional.topStart,
height: 115.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
7.5.w,
),
// 比外圆角小边框宽度
color: Colors.black87, // 背景色
),
child: TextField(
controller: familyInfoController,
onChanged: (text) {},
inputFormatters: [
ATCustomFilteringTextInputFormatter2(),
ATAccurateLengthLimitingTextInputFormatter(
_familyInfoMaxLength,
),
],
maxLines: 5,
decoration: InputDecoration(
hintText:
ATAppLocalizations.of(
context,
)!.enterFamilyInfo,
hintStyle: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
contentPadding: EdgeInsets.only(
top: 0.w,
),
counterText: '',
isDense: true,
filled: false,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
border: InputBorder.none,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
disabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
suffix: Row(
mainAxisSize: MainAxisSize.min,
children: [SizedBox(width: 3.w)],
),
),
style: TextStyle(
fontSize: sp(14),
color: Colors.white,
textBaseline: TextBaseline.alphabetic,
),
),
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
text(
'$_familyInfoCurrentLength/$_familyInfoMaxLength',
textColor: Colors.white,
),
SizedBox(width: 3.w),
],
),
],
),
),
SizedBox(height: 15.w),
ATDebounceWidget(
debounceTime: Duration(milliseconds: 800),
child: Container(
width: 180.w,
padding: EdgeInsets.symmetric(vertical: 12.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(60.w),
gradient:
_familyNameCurrentLength > 0
? LinearGradient(
colors: [
Color(0xff0D0022),
Color(0xff9F63FF),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
)
: LinearGradient(
colors: [
Colors.white24,
Colors.white24,
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
child: Column(
children: [
text(
ATAppLocalizations.of(
context,
)!.createFamily,
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Image.asset(
"atu_images/general/at_icon_jb.png",
width: 18.w,
),
SizedBox(width: 2.w),
isFreeCreate? text(
"0",
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
):Container(),
isFreeCreate? SizedBox(width: 5.w):Container(),
text(
"100000",
fontSize: 15.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
decoration:
isFreeCreate
? TextDecoration.lineThrough
: TextDecoration.none,
),
],
),
],
),
),
onTap: () {
if (familyNameController.text.isEmpty) {
ATTts.show(
ATAppLocalizations.of(
context,
)!.enterFamilyName,
);
return;
}
_submit();
},
),
SizedBox(height: 130.w),
],
),
),
),
),
),
],
),
);
},
),
),
);
}
void _submit() {
if (familyCover.isEmpty) {
familyCover =
AccountStorage().getCurrentUser()?.userProfile?.userAvatar ?? "";
}
ATLoadingManager.exhibitOperation();
GroupRepository()
.createFamily(
familyCover,
familyNameController.text,
familyInfoController.text,
)
.then((result) {
Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).updateFamily("${result}");
ATTts.show(ATAppLocalizations.of(context)!.createFamilySuccess);
ATLoadingManager.veilRoutine();
ATNavigatorUtils.push(
context,
"${FamilyRoute.familyInfo}?familyId=$result",
replace: true,
);
})
.catchError((_) {
ATLoadingManager.veilRoutine();
ATNavigatorUtils.goBack(context);
});
}
}