opt select topic

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-26 18:40:57 +08:00
parent 3edac65ae8
commit 8ce33736a0
3 changed files with 1316 additions and 62 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,8 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/draggable_scrollable_sheet.dart'
show DraggableScrollableSheet;
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/models/common/publish_panel_type.dart';
@@ -15,7 +17,7 @@ import 'package:PiliPlus/pages/emote/controller.dart';
import 'package:PiliPlus/pages/emote/view.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide DraggableScrollableSheet;
import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -596,6 +598,7 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
}
}
double _offset = 0;
Future<void> _onSelectTopic() async {
TopicPubSearchItem? res = await showModalBottomSheet(
context: context,
@@ -609,10 +612,13 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
snap: true,
minChildSize: 0,
maxChildSize: 1,
initialChildSize: 0.65,
initialChildSize: _offset == 0 ? 0.65 : 1,
initialScrollOffset: _offset,
snapSizes: [0.65],
builder: (context, scrollController) =>
SelectTopicPanel(scrollController: scrollController),
builder: (context, scrollController) => SelectTopicPanel(
scrollController: scrollController,
callback: (offset) => _offset = offset,
),
),
);
if (res != null) {

View File

@@ -13,9 +13,11 @@ class SelectTopicPanel extends StatefulWidget {
const SelectTopicPanel({
super.key,
this.scrollController,
this.callback,
});
final ScrollController? scrollController;
final ValueChanged<double>? callback;
@override
State<SelectTopicPanel> createState() => _SelectTopicPanelState();
@@ -24,6 +26,8 @@ class SelectTopicPanel extends StatefulWidget {
class _SelectTopicPanelState extends State<SelectTopicPanel> {
final _controller = Get.put(SelectTopicController());
double offset = 0;
@override
void initState() {
super.initState();
@@ -32,17 +36,20 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
}
}
@override
void dispose() {
widget.callback?.call(offset);
super.dispose();
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Column(
children: [
InkWell(
GestureDetector(
onTap: Get.back,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(18),
topRight: Radius.circular(18),
),
behavior: HitTestBehavior.opaque,
child: Container(
height: 35,
padding: const EdgeInsets.only(bottom: 2),
@@ -76,9 +83,7 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
border: const OutlineInputBorder(
gapPadding: 0,
borderSide: BorderSide.none,
borderRadius: BorderRadius.all(
Radius.circular(25),
),
borderRadius: BorderRadius.all(Radius.circular(25)),
),
isDense: true,
filled: true,
@@ -140,7 +145,12 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
Loading() => loadingWidget,
Success<List<TopicPubSearchItem>?>(:var response) =>
response?.isNotEmpty == true
? ListView.builder(
? NotificationListener<ScrollNotification>(
onNotification: (notification) {
offset = notification.metrics.pixels;
return false;
},
child: ListView.builder(
padding: EdgeInsets.only(
bottom: MediaQuery.paddingOf(context).bottom +
MediaQuery.viewInsetsOf(context).bottom +
@@ -185,16 +195,16 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
);
},
itemCount: response!.length,
)
: scrollErrorWidget(
controller: widget.scrollController,
onReload: _controller.onReload,
),
Error(:var errMsg) => scrollErrorWidget(
)
: _errWidget(),
Error(:var errMsg) => _errWidget(errMsg),
};
}
Widget _errWidget([String? errMsg]) => scrollErrorWidget(
errMsg: errMsg,
controller: widget.scrollController,
onReload: _controller.onReload,
),
};
}
);
}