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