opt publish page

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-05-28 12:58:50 +08:00
parent 6464987437
commit 6c61ff59ff
8 changed files with 55 additions and 70 deletions

View File

@@ -27,7 +27,8 @@ abstract class CommonPublishPage<T> extends StatefulWidget {
abstract class CommonPublishPageState<T extends CommonPublishPage> abstract class CommonPublishPageState<T extends CommonPublishPage>
extends State<T> extends State<T>
with WidgetsBindingObserver { with WidgetsBindingObserver {
late final FocusNode focusNode; late bool _paused = false;
final FocusNode focusNode = FocusNode();
late final controller = ChatBottomPanelContainerController<PanelType>( late final controller = ChatBottomPanelContainerController<PanelType>(
uiScale: Pref.uiScale, uiScale: Pref.uiScale,
); );
@@ -42,23 +43,19 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
bool hasPub = false; bool hasPub = false;
void initPubState(); void initPubState();
bool get handleKeyboard => Platform.isAndroid && widget.autofocus;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
if (Platform.isAndroid) { if (handleKeyboard) {
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
} }
focusNode = FocusNode();
initPubState(); initPubState();
if (widget.autofocus) { if (widget.autofocus) {
Future.delayed(const Duration(milliseconds: 300), () { _requestFocus(duration: const Duration(milliseconds: 300));
if (mounted) {
focusNode.requestFocus();
}
});
} }
} }
@@ -69,35 +66,41 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
} }
focusNode.dispose(); focusNode.dispose();
editController.dispose(); editController.dispose();
if (Platform.isAndroid) { if (handleKeyboard) {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
} }
super.dispose(); super.dispose();
} }
void _requestFocus() { void _safeRequestFocus() {
Future.delayed(const Duration(microseconds: 200), focusNode.requestFocus); if (mounted) {
focusNode.requestFocus();
}
}
void _requestFocus({Duration duration = const Duration(microseconds: 200)}) {
Future.delayed(duration, _safeRequestFocus);
} }
@override @override
void didChangeAppLifecycleState(AppLifecycleState state) { void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) { if (state == .resumed) {
if (mounted && if (_paused) {
widget.autofocus && _paused = false;
(panelType.value == PanelType.keyboard || final panelType = this.panelType.value;
panelType.value == PanelType.none)) { if (panelType == .keyboard || panelType == .none) {
controller.restoreChatPanel(); WidgetsBinding.instance.addPostFrameCallback((_) {
WidgetsBinding.instance.addPostFrameCallback((_) { if (focusNode.hasFocus) {
if (focusNode.hasFocus) { focusNode.unfocus();
focusNode.unfocus(); _requestFocus();
_requestFocus(); } else {
} else { _requestFocus();
_requestFocus(); }
} });
}); }
} }
} else if (state == AppLifecycleState.paused) { } else if (state == .paused) {
controller.keepChatPanel(); _paused = true;
if (focusNode.hasFocus) { if (focusNode.hasFocus) {
focusNode.unfocus(); focusNode.unfocus();
} }

View File

@@ -111,27 +111,23 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
GestureDetector( GestureDetector(
onTap: () async { onTap: () => PageUtils.imageView(
controller.keepChatPanel(); imgList: imageList
await PageUtils.imageView( .map(
imgList: imageList (img) => switch (img) {
.map( FilePicModel e => SourceModel(
(img) => switch (img) { url: e.path,
FilePicModel e => SourceModel( sourceType: .fileImage,
url: e.path, ),
sourceType: .fileImage, OpusPicModel e => SourceModel(
), url: e.url!,
OpusPicModel e => SourceModel( sourceType: .networkImage,
url: e.url!, ),
sourceType: .networkImage, },
), )
}, .toList(),
) initialPage: index,
.toList(), ),
initialPage: index,
);
controller.restoreChatPanel();
},
onLongPress: () { onLongPress: () {
Feedback.forLongPress(context); Feedback.forLongPress(context);
onClear(); onClear();
@@ -328,7 +324,6 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
late double _mentionOffset = 0; late double _mentionOffset = 0;
Future<void>? onMention([bool fromClick = false]) async { Future<void>? onMention([bool fromClick = false]) async {
controller.keepChatPanel();
final res = await DynMentionPanel.onDynMention( final res = await DynMentionPanel.onDynMention(
context, context,
offset: _mentionOffset, offset: _mentionOffset,
@@ -345,7 +340,6 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
res.clear(); res.clear();
} }
} }
controller.restoreChatPanel();
} }
void _onInsertUser(MentionItem e, bool fromClick) { void _onInsertUser(MentionItem e, bool fromClick) {

View File

@@ -502,7 +502,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
onPressed: _isEdit || _isPrivate.value onPressed: _isEdit || _isPrivate.value
? null ? null
: () async { : () async {
controller.keepChatPanel();
DateTime nowDate = DateTime.now(); DateTime nowDate = DateTime.now();
final selectedDate = await showDatePicker( final selectedDate = await showDatePicker(
context: context, context: context,
@@ -548,7 +547,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
); );
} }
} }
controller.restoreChatPanel();
}, },
child: const Text('定时发布'), child: const Text('定时发布'),
) )
@@ -653,7 +651,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
Widget get voteBtn => ToolbarIconButton( Widget get voteBtn => ToolbarIconButton(
onPressed: () async { onPressed: () async {
controller.keepChatPanel();
final voteItem = editController.items.firstWhereOrNull( final voteItem = editController.items.firstWhereOrNull(
(e) => e.type == RichTextType.vote, (e) => e.type == RichTextType.vote,
); );
@@ -698,7 +695,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
); );
} }
} }
controller.restoreChatPanel();
}, },
icon: const Icon(Icons.bar_chart_rounded, size: 24), icon: const Icon(Icons.bar_chart_rounded, size: 24),
tooltip: '投票', tooltip: '投票',
@@ -814,7 +810,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
double _topicOffset = 0; double _topicOffset = 0;
Future<void> _onSelectTopic() async { Future<void> _onSelectTopic() async {
controller.keepChatPanel();
TopicItem? res = await SelectTopicPanel.onSelectTopic( TopicItem? res = await SelectTopicPanel.onSelectTopic(
context, context,
offset: _topicOffset, offset: _topicOffset,
@@ -823,7 +818,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
if (res != null) { if (res != null) {
_topic.value = Pair(first: res.id, second: res.name); _topic.value = Pair(first: res.id, second: res.name);
} }
controller.restoreChatPanel();
} }
@override @override
@@ -881,7 +875,6 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
} }
Future<void> _onReserve() async { Future<void> _onReserve() async {
controller.keepChatPanel();
final ReserveInfoData? reserveInfo = await Navigator.of(context).push( final ReserveInfoData? reserveInfo = await Navigator.of(context).push(
GetPageRoute( GetPageRoute(
page: () => CreateReservePage(sid: _reserveCard.value?.id), page: () => CreateReservePage(sid: _reserveCard.value?.id),
@@ -890,6 +883,5 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
if (reserveInfo != null) { if (reserveInfo != null) {
_reserveCard.value = reserveInfo; _reserveCard.value = reserveInfo;
} }
controller.restoreChatPanel();
} }
} }

View File

@@ -233,7 +233,7 @@ class MainController extends GetxController
} }
this.navigationBars = navigationBars; this.navigationBars = navigationBars;
final defPage = Pref.defaultHomePage; final defPage = Pref.defaultHomePage;
selectedIndex.value = navigationBars.indexWhere((e) => e == defPage); selectedIndex.value = navigationBars.indexOf(defPage);
} }
void checkDefaultSearch([bool shouldCheck = false]) { void checkDefaultSearch([bool shouldCheck = false]) {

View File

@@ -290,7 +290,6 @@ class _ReplyPageState extends CommonRichTextPubPageState<ReplyPage> {
children: [ children: [
item( item(
onTap: () async { onTap: () async {
controller.keepChatPanel();
final ({String title, String url})? res = await Get.to( final ({String title, String url})? res = await Get.to(
ReplySearchPage(type: widget.replyType, oid: widget.oid), ReplySearchPage(type: widget.replyType, oid: widget.oid),
); );
@@ -301,7 +300,6 @@ class _ReplyPageState extends CommonRichTextPubPageState<ReplyPage> {
rawText: '${res.url} ', rawText: '${res.url} ',
); );
} }
controller.restoreChatPanel();
}, },
icon: Icon(Icons.post_add, size: 28, color: color), icon: Icon(Icons.post_add, size: 28, color: color),
title: '插入内容', title: '插入内容',

View File

@@ -428,9 +428,8 @@ class _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {
); );
} }
Future<void> _showColorPicker() async { void _showColorPicker() {
controller.keepChatPanel(); showDialog(
await showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
@@ -446,7 +445,6 @@ class _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {
), ),
), ),
); );
controller.restoreChatPanel();
} }
@override @override

View File

@@ -255,11 +255,11 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "packages/chat_bottom_container" path: "packages/chat_bottom_container"
ref: main ref: dev
resolved-ref: dba2bf10db4a6f89564d9be63ce17b18f0f7e3e5 resolved-ref: "88d5d2c3c76855258ead306d8921ef706033beef"
url: "https://github.com/bggRGjQaUbCoE/flutter_chat_packages.git" url: "https://github.com/bggRGjQaUbCoE/flutter_chat_packages.git"
source: git source: git
version: "0.3.2" version: "0.5.0"
checked_yaml: checked_yaml:
dependency: transitive dependency: transitive
description: description:

View File

@@ -54,7 +54,7 @@ dependencies:
chat_bottom_container: chat_bottom_container:
git: git:
url: https://github.com/bggRGjQaUbCoE/flutter_chat_packages.git url: https://github.com/bggRGjQaUbCoE/flutter_chat_packages.git
ref: main ref: dev
path: packages/chat_bottom_container path: packages/chat_bottom_container
collection: ^1.19.1 collection: ^1.19.1
connectivity_plus: ^7.1.1 connectivity_plus: ^7.1.1