mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-02 09:08:17 +08:00
@@ -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();
|
||||
}
|
||||
|
||||
@@ -111,27 +111,23 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () async {
|
||||
controller.keepChatPanel();
|
||||
await PageUtils.imageView(
|
||||
imgList: imageList
|
||||
.map(
|
||||
(img) => switch (img) {
|
||||
FilePicModel e => SourceModel(
|
||||
url: e.path,
|
||||
sourceType: .fileImage,
|
||||
),
|
||||
OpusPicModel e => SourceModel(
|
||||
url: e.url!,
|
||||
sourceType: .networkImage,
|
||||
),
|
||||
},
|
||||
)
|
||||
.toList(),
|
||||
initialPage: index,
|
||||
);
|
||||
controller.restoreChatPanel();
|
||||
},
|
||||
onTap: () => PageUtils.imageView(
|
||||
imgList: imageList
|
||||
.map(
|
||||
(img) => switch (img) {
|
||||
FilePicModel e => SourceModel(
|
||||
url: e.path,
|
||||
sourceType: .fileImage,
|
||||
),
|
||||
OpusPicModel e => SourceModel(
|
||||
url: e.url!,
|
||||
sourceType: .networkImage,
|
||||
),
|
||||
},
|
||||
)
|
||||
.toList(),
|
||||
initialPage: index,
|
||||
),
|
||||
onLongPress: () {
|
||||
Feedback.forLongPress(context);
|
||||
onClear();
|
||||
@@ -328,7 +324,6 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
|
||||
late double _mentionOffset = 0;
|
||||
Future<void>? onMention([bool fromClick = false]) async {
|
||||
controller.keepChatPanel();
|
||||
final res = await DynMentionPanel.onDynMention(
|
||||
context,
|
||||
offset: _mentionOffset,
|
||||
@@ -345,7 +340,6 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
res.clear();
|
||||
}
|
||||
}
|
||||
controller.restoreChatPanel();
|
||||
}
|
||||
|
||||
void _onInsertUser(MentionItem e, bool fromClick) {
|
||||
|
||||
Reference in New Issue
Block a user