发现页面
This commit is contained in:
146
lib/views/moments/publish/publish_page.dart
Normal file
146
lib/views/moments/publish/publish_page.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
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.tTextColor999.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,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user