opt text selection

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-25 13:00:02 +08:00
parent 56ca0cade4
commit 10b723fa64
11 changed files with 648 additions and 390 deletions

View File

@@ -1,7 +1,5 @@
// 内容
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/emote_span.dart';
import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text;
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';

View File

@@ -10,6 +10,7 @@ import 'package:PiliPlus/common/widgets/scroll_behavior.dart'
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_to_box_adapter.dart';
import 'package:PiliPlus/common/widgets/tap_region_surface.dart';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -105,15 +106,18 @@ class _DynamicDetailPageState
);
}
dynamic _scrollable;
@override
void dispose() {
_scrollable = null;
refreshController?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
final child = Scaffold(
resizeToAvoidBottomInset: false,
appBar: _buildAppBar(),
body: Padding(
@@ -131,6 +135,10 @@ class _DynamicDetailPageState
child: _buildBottom(),
),
);
return SelectionTapRegionSurface(
isScrolling: () => _scrollable?.shouldIgnorePointer ?? false,
child: child,
);
}
void _onEdit() {
@@ -410,26 +418,33 @@ class _DynamicDetailPageState
return child;
}
Widget _buildDynPanel() {
return SliverToBoxWithOffsetAdapter(
offset: 55,
onVisibilityChanged: controller.showTitle.call,
child: Builder(
builder: (context) {
_scrollable = Scrollable.maybeOf(context);
return DynamicPanel(
item: controller.dynItem,
isDetail: true,
isDetailPortraitW: isPortrait,
onSetPubSetting: controller.onSetPubSetting,
onEdit: _onEdit,
onSetReplySubject: controller.onSetReplySubject,
);
},
),
);
}
Widget _buildPortrait(double padding) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: padding),
child: NestedScrollView(
scrollBehavior: const NoOverscrollIndicator(),
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverToBoxWithOffsetAdapter(
offset: 55,
onVisibilityChanged: controller.showTitle.call,
child: DynamicPanel(
item: controller.dynItem,
isDetail: true,
isDetailPortraitW: isPortrait,
onSetPubSetting: controller.onSetPubSetting,
onEdit: _onEdit,
onSetReplySubject: controller.onSetReplySubject,
),
),
];
return [_buildDynPanel()];
},
body: Column(
children: [
@@ -456,18 +471,7 @@ class _DynamicDetailPageState
left: padding,
bottom: this.padding.bottom + 100,
),
sliver: SliverToBoxWithOffsetAdapter(
offset: 55,
onVisibilityChanged: controller.showTitle.call,
child: DynamicPanel(
item: controller.dynItem,
isDetail: true,
isDetailPortraitW: isPortrait,
onSetPubSetting: controller.onSetPubSetting,
onEdit: _onEdit,
onSetReplySubject: controller.onSetReplySubject,
),
),
sliver: _buildDynPanel(),
),
],
),

View File

@@ -25,7 +25,11 @@ List<SettingsModel> get privacySettings => [
context: context,
builder: (context) => AlertDialog(
title: const Text('账号模式详情'),
content: SingleChildScrollView(child: _getAccountDetail(context)),
content: SelectionArea(
child: SingleChildScrollView(
child: _getAccountDetail(context),
),
),
actions: [
TextButton(
onPressed: Get.back,
@@ -52,12 +56,10 @@ Widget _getAccountDetail(BuildContext context) {
..add(Center(child: Text(i.title, style: theme.titleMedium)))
..add(Text(url.join('\n')));
}
return SelectionArea(
child: Column(
mainAxisSize: .min,
crossAxisAlignment: .start,
spacing: 8,
children: children,
),
return Column(
spacing: 8,
mainAxisSize: .min,
crossAxisAlignment: .start,
children: children,
);
}

View File

@@ -7,13 +7,11 @@ import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/dialog/report.dart';
import 'package:PiliPlus/common/widgets/emote_span.dart';
import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text;
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
import 'package:PiliPlus/common/widgets/selection_text.dart';
import 'package:PiliPlus/common/widgets/translucent_row.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo, ReplyControl, Content, Url, ReplyControl_VoteOption, Emote;