Files
zh-chat-flutter/lib/views/moments/publish/publish_page.dart
2022-10-26 13:41:29 +08:00

147 lines
4.7 KiB
Dart

import 'package:chat/configs/app_colors.dart';
import 'package:chat/configs/app_size.dart';
import 'package:chat/controllers/publish_controller.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
class MomentsPublishPage extends StatelessWidget {
const MomentsPublishPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final ctrl = Get.put(PublishController());
return GestureDetector(
onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
child: Scaffold(
appBar: AppBar(
title: const Text('发布动态'),
actions: [
Center(
child: Padding(
padding: const EdgeInsets.only(
right: AppSize.horizontalLargePadding,
),
child: Obx(() {
return ElevatedButton(
style: ButtonStyle(
elevation: MaterialStateProperty.all(0),
backgroundColor: MaterialStateProperty.resolveWith(
(states) {
if (states.contains(MaterialState.disabled)) {
return AppColors.active.withAlpha(128);
} else {
return AppColors.primary;
}
},
),
minimumSize: MaterialStateProperty.all(Size.zero),
padding: MaterialStateProperty.all(
const EdgeInsets.symmetric(
vertical: 6,
horizontal: 16,
),
),
),
onPressed: ctrl.publishContent.isNotEmpty
? () => ctrl.publish()
: null,
child: const Text('发布'),
);
}),
),
)
],
),
body: CustomScrollView(
slivers: [
const SizedBox(height: 10).sliverBox,
TextField(
decoration: const InputDecoration(
contentPadding: EdgeInsets.zero,
border: InputBorder.none,
focusedBorder: InputBorder.none,
disabledBorder: InputBorder.none,
fillColor: AppColors.transparent,
filled: true,
hintText: '这一刻的想法...',
hintStyle: TextStyle(
fontSize: 14,
),
),
onChanged: (value) => ctrl.publishContent.value = value,
minLines: 7,
maxLines: 14,
).sliverBox.contentPadding,
const SizedBox(height: 8).sliverBox,
Obx(() {
return GridView.count(
crossAxisCount: 3,
childAspectRatio: 1,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
children: [
...ctrl.publishFileList
.map((e) =>
showImageWidget(ctrl.publishFileList.indexOf(e)))
.toList(),
if (ctrl.publishFileList.length < 9) pickImageWidget(),
],
).sliverBox.contentPadding;
}),
],
),
),
);
}
Widget showImageWidget(int index) {
final ctrl = PublishController.to;
return GestureDetector(
onLongPress: () => ctrl.deleteImageOrVideo(index),
onTap: () => ctrl.previewFiles(index),
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Image(
image: AssetEntityImageProvider(
ctrl.publishFileList[index],
isOriginal: false,
),
fit: BoxFit.cover,
alignment: Alignment.center,
),
),
);
}
Widget pickImageWidget() {
return InkWell(
onTap: () => PublishController.to.pickImageOrVideo(),
child: Container(
decoration: BoxDecoration(
color: AppColors.unactive.withOpacity(0.2),
borderRadius: BorderRadius.circular(4),
),
child: const Icon(
Icons.add_rounded,
size: 40,
color: AppColors.active,
),
),
);
}
}
extension on Widget {
Widget get contentPadding {
return SliverPadding(
padding: const EdgeInsets.symmetric(
horizontal: AppSize.horizontalLargePadding,
),
sliver: this,
);
}
}