mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-21 09:37:02 +08:00
opt select topic
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
1238
lib/common/widgets/draggable_scrollable_sheet.dart
Normal file
1238
lib/common/widgets/draggable_scrollable_sheet.dart
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,8 @@ import 'dart:math';
|
|||||||
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
|
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
|
||||||
import 'package:PiliPlus/common/widgets/button/toolbar_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/custom_icon.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/draggable_scrollable_sheet.dart'
|
||||||
|
show DraggableScrollableSheet;
|
||||||
import 'package:PiliPlus/common/widgets/pair.dart';
|
import 'package:PiliPlus/common/widgets/pair.dart';
|
||||||
import 'package:PiliPlus/http/dynamics.dart';
|
import 'package:PiliPlus/http/dynamics.dart';
|
||||||
import 'package:PiliPlus/models/common/publish_panel_type.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/pages/emote/view.dart';
|
||||||
import 'package:PiliPlus/utils/request_utils.dart';
|
import 'package:PiliPlus/utils/request_utils.dart';
|
||||||
import 'package:PiliPlus/utils/storage.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/services.dart' show LengthLimitingTextInputFormatter;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -596,6 +598,7 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double _offset = 0;
|
||||||
Future<void> _onSelectTopic() async {
|
Future<void> _onSelectTopic() async {
|
||||||
TopicPubSearchItem? res = await showModalBottomSheet(
|
TopicPubSearchItem? res = await showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
@@ -609,10 +612,13 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
|
|||||||
snap: true,
|
snap: true,
|
||||||
minChildSize: 0,
|
minChildSize: 0,
|
||||||
maxChildSize: 1,
|
maxChildSize: 1,
|
||||||
initialChildSize: 0.65,
|
initialChildSize: _offset == 0 ? 0.65 : 1,
|
||||||
|
initialScrollOffset: _offset,
|
||||||
snapSizes: [0.65],
|
snapSizes: [0.65],
|
||||||
builder: (context, scrollController) =>
|
builder: (context, scrollController) => SelectTopicPanel(
|
||||||
SelectTopicPanel(scrollController: scrollController),
|
scrollController: scrollController,
|
||||||
|
callback: (offset) => _offset = offset,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
|
|||||||
@@ -13,9 +13,11 @@ class SelectTopicPanel extends StatefulWidget {
|
|||||||
const SelectTopicPanel({
|
const SelectTopicPanel({
|
||||||
super.key,
|
super.key,
|
||||||
this.scrollController,
|
this.scrollController,
|
||||||
|
this.callback,
|
||||||
});
|
});
|
||||||
|
|
||||||
final ScrollController? scrollController;
|
final ScrollController? scrollController;
|
||||||
|
final ValueChanged<double>? callback;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<SelectTopicPanel> createState() => _SelectTopicPanelState();
|
State<SelectTopicPanel> createState() => _SelectTopicPanelState();
|
||||||
@@ -24,6 +26,8 @@ class SelectTopicPanel extends StatefulWidget {
|
|||||||
class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
||||||
final _controller = Get.put(SelectTopicController());
|
final _controller = Get.put(SelectTopicController());
|
||||||
|
|
||||||
|
double offset = 0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@@ -32,17 +36,20 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
widget.callback?.call(offset);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
InkWell(
|
GestureDetector(
|
||||||
onTap: Get.back,
|
onTap: Get.back,
|
||||||
borderRadius: const BorderRadius.only(
|
behavior: HitTestBehavior.opaque,
|
||||||
topLeft: Radius.circular(18),
|
|
||||||
topRight: Radius.circular(18),
|
|
||||||
),
|
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 35,
|
height: 35,
|
||||||
padding: const EdgeInsets.only(bottom: 2),
|
padding: const EdgeInsets.only(bottom: 2),
|
||||||
@@ -76,9 +83,7 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
|||||||
border: const OutlineInputBorder(
|
border: const OutlineInputBorder(
|
||||||
gapPadding: 0,
|
gapPadding: 0,
|
||||||
borderSide: BorderSide.none,
|
borderSide: BorderSide.none,
|
||||||
borderRadius: BorderRadius.all(
|
borderRadius: BorderRadius.all(Radius.circular(25)),
|
||||||
Radius.circular(25),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
isDense: true,
|
isDense: true,
|
||||||
filled: true,
|
filled: true,
|
||||||
@@ -140,7 +145,12 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
|||||||
Loading() => loadingWidget,
|
Loading() => loadingWidget,
|
||||||
Success<List<TopicPubSearchItem>?>(:var response) =>
|
Success<List<TopicPubSearchItem>?>(:var response) =>
|
||||||
response?.isNotEmpty == true
|
response?.isNotEmpty == true
|
||||||
? ListView.builder(
|
? NotificationListener<ScrollNotification>(
|
||||||
|
onNotification: (notification) {
|
||||||
|
offset = notification.metrics.pixels;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
child: ListView.builder(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
bottom: MediaQuery.paddingOf(context).bottom +
|
bottom: MediaQuery.paddingOf(context).bottom +
|
||||||
MediaQuery.viewInsetsOf(context).bottom +
|
MediaQuery.viewInsetsOf(context).bottom +
|
||||||
@@ -185,16 +195,16 @@ class _SelectTopicPanelState extends State<SelectTopicPanel> {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemCount: response!.length,
|
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,
|
errMsg: errMsg,
|
||||||
controller: widget.scrollController,
|
controller: widget.scrollController,
|
||||||
onReload: _controller.onReload,
|
onReload: _controller.onReload,
|
||||||
),
|
);
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user