|
|
|
@ -1,7 +1,6 @@ |
|
|
|
import 'package:common_utils/common_utils.dart'; |
|
|
|
import 'package:fleather/fleather.dart'; |
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
import 'package:flutter_markdown/flutter_markdown.dart'; |
|
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
|
|
import 'package:get/get.dart'; |
|
|
|
import 'package:parchment/codecs.dart'; |
|
|
|
@ -32,9 +31,25 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
|
final GlobalKey<EditorState> _editorKey = GlobalKey(); |
|
|
|
FleatherController? _fleatherController; |
|
|
|
|
|
|
|
bool _hasFocus = false; |
|
|
|
|
|
|
|
@override |
|
|
|
void initState() { |
|
|
|
super.initState(); |
|
|
|
_initController(); |
|
|
|
_addressController.addListener(_handleAddressChanged); |
|
|
|
_personnelController.addListener(_handlePersonnelChanged); |
|
|
|
_focusNode.addListener(() { |
|
|
|
setState(() { |
|
|
|
_hasFocus = _focusNode.hasFocus; |
|
|
|
}); |
|
|
|
}); |
|
|
|
ever(_controller.personnelNumberModifications, (value) { |
|
|
|
_initController(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
void _initController() { |
|
|
|
_addressController.text = _addressPrefix + |
|
|
|
(_controller.meetingDetails.value.address.isNotEmpty |
|
|
|
? _controller.meetingDetails.value.address |
|
|
|
@ -43,9 +58,9 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
|
(_controller.meetingDetails.value.personnel.isNotEmpty |
|
|
|
? _controller.meetingDetails.value.personnel |
|
|
|
: '[输入与会人员]'); |
|
|
|
_addressController.addListener(_handleAddressChanged); |
|
|
|
_personnelController.addListener(_handlePersonnelChanged); |
|
|
|
_initController(); |
|
|
|
final markdown = const ParchmentMarkdownCodec() |
|
|
|
.decode(_controller.meetingDetails.value.summary); |
|
|
|
_fleatherController = FleatherController(document: markdown); |
|
|
|
} |
|
|
|
|
|
|
|
void _handleAddressChanged() { |
|
|
|
@ -108,14 +123,24 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Future<void> _initController() async { |
|
|
|
final markdown = const ParchmentMarkdownCodec() |
|
|
|
.decode(_controller.meetingDetails.value.summary); |
|
|
|
_fleatherController = FleatherController(document: markdown); |
|
|
|
void _saveSummary() async { |
|
|
|
final markdown = |
|
|
|
const ParchmentMarkdownCodec().encode(_fleatherController!.document); |
|
|
|
if (markdown != _controller.meetingDetails.value.summary) { |
|
|
|
SqfliteApi.editMeeting( |
|
|
|
_controller.id, |
|
|
|
{'summary': markdown}, |
|
|
|
); |
|
|
|
_controller.meetingDetails.value.summary = markdown; |
|
|
|
_controller.summaryNumberModifications.value++; |
|
|
|
} |
|
|
|
_focusNode.dispose(); |
|
|
|
_fleatherController?.dispose(); |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
void dispose() { |
|
|
|
_saveSummary(); |
|
|
|
_addressController.dispose(); |
|
|
|
_personnelController.dispose(); |
|
|
|
super.dispose(); |
|
|
|
@ -292,14 +317,17 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
|
), |
|
|
|
Padding( |
|
|
|
padding: EdgeInsets.only(top: 10.w), |
|
|
|
child: MarkdownBody( |
|
|
|
data: _controller.meetingDetails.value.summary, |
|
|
|
child: FleatherEditor( |
|
|
|
controller: _fleatherController!, |
|
|
|
focusNode: _focusNode, |
|
|
|
editorKey: _editorKey, |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
if (!_hasFocus) |
|
|
|
Obx( |
|
|
|
() => Positioned( |
|
|
|
bottom: 20.w, |
|
|
|
@ -366,6 +394,7 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
if (_hasFocus) |
|
|
|
Positioned( |
|
|
|
bottom: 0, |
|
|
|
left: -12.w, |
|
|
|
|