import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:food_hub_app/provider/food_provider.dart'; import 'package:food_hub_app/utils/minio_utils.dart'; import 'package:food_hub_app/widgets/common/form.dart'; import 'package:food_hub_app/widgets/common/image.dart'; import 'package:food_hub_app/widgets/common/index.dart'; import 'package:provider/provider.dart'; class MomentFormPage extends StatefulWidget { const MomentFormPage({super.key}); @override State createState() => _MomentFormPageState(); } class _MomentFormPageState extends State { final _formKey = GlobalKey(); final _focusNode = FocusNode(); static const String _contentField = 'content'; static const int maxContentLength = 200; static const int maxImageCount = 9; // 最大图片数量 Widget _buildContentField() { return FormBuilderTextField( name: _contentField, focusNode: _focusNode, maxLines: 5, minLines: 3, maxLength: maxContentLength, buildCounter: ( context, { required currentLength, required isFocused, maxLength, }) { return Text( '$currentLength/$maxContentLength', style: TextStyle( color: currentLength > maxLength! ? Colors.red : Theme.of(context).colorScheme.primary, ), ); }, onChanged: (value) { setState(() { // provider.momentFormItem.content = value!; }); }, decoration: buildInputDecoration(context: context, hintText: '请输入朋友圈内容'), validator: (value) { if (value == null || value.isEmpty) { return '请输入朋友圈内容'; } if (value.length > maxContentLength) { // 修正为使用 maxContentLength return '内容不能超过${maxContentLength}字'; } return null; }, ); } Widget _buildImageGrid(FoodProvider provider) { final imageUrls = provider.momentFormItem.imageList; return Wrap( spacing: 8, runSpacing: 8, children: [ ...imageUrls.asMap().entries.map((entry) { final index = entry.key; final imageUrl = entry.value; return Stack( children: [ buildImagePreviewItem( context: context, imageUrls: imageUrls, index: index, onRemoveImage: () => _removeImage(provider, index), ) ], ); }), // 上传按钮(如果还有剩余位置) if (imageUrls.length < maxImageCount) buildImageUploadButton(onPickImage: () => _pickImages(provider)), ], ); } Widget _buildFormBuilder() { final provider = context.watch(); return FormBuilder( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ buildFormLabel('朋友圈内容', required: true), const SizedBox(height: 8), _buildContentField(), const SizedBox(height: 20), buildFormLabel('上传图片', required: true), const SizedBox(height: 10), _buildImageGrid(provider), const SizedBox(height: 20), buildFormButtonGroup( context: context, onConfirm: () => _submitForm(provider), ), ], ), ); } /// 选择多张图片 Future _pickImages(FoodProvider provider) async { final currentCount = provider.momentFormItem.imageList.length; final remainingCount = maxImageCount - currentCount; if (remainingCount <= 0) { showErrorToast('最多只能上传$maxImageCount张图片'); return; } FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['jpg', 'jpeg', 'png'], allowMultiple: true, ); if (result != null) { // 限制选择数量 final filesToUpload = result.files.take(remainingCount).toList(); // 显示加载提示 // showLoadingToast('正在上传图片...'); try { final newImageUrls = []; // 逐个上传图片 for (final file in filesToUpload) { final fileName = await MinIOHelper().uploadFile(file: file); newImageUrls.add(fileName); } // 更新图片列表 setState(() { provider.momentFormItem.imageList.addAll(newImageUrls); }); showSuccessToast('图片上传成功'); } catch (e) { showErrorToast('图片上传失败'); } } } /// 移除单张图片 void _removeImage(FoodProvider provider, int index) { setState(() { provider.momentFormItem.imageList.removeAt(index); }); } /// 提交表单 void _submitForm(FoodProvider provider) { if (_formKey.currentState?.saveAndValidate() ?? false) { // 这里处理表单提交逻辑 // print('提交内容: ${_formKey.currentState?.value[_contentField]}'); // print('图片列表: ${provider.recordFormItem.imageUrls}'); } } @override Widget build(BuildContext context) { final colors = Theme.of(context).colorScheme; final provider = context.watch(); final String title = provider.isEditing ? '编辑朋友圈' : '新增朋友圈'; return Scaffold( appBar: AppBar( title: Text(title, style: const TextStyle(color: Colors.white)), backgroundColor: colors.primary, leading: IconButton( icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: () => Navigator.pop(context), ), ), backgroundColor: const Color(0xFFF5F5F5), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(10), child: BuildCard(child: _buildFormBuilder()), ), ), ); } }