diff --git a/lib/common/widgets/list_sheet.dart b/lib/common/widgets/list_sheet.dart index 5376e3cde..9324d69a9 100644 --- a/lib/common/widgets/list_sheet.dart +++ b/lib/common/widgets/list_sheet.dart @@ -423,8 +423,7 @@ class _ListSheetContentState extends State child: _isList ? Material( color: Colors.transparent, - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _ctr, children: List.generate( widget.season.sections.length, diff --git a/lib/common/widgets/spring_physics.dart b/lib/common/widgets/spring_physics.dart index d4bbd19bd..4c0eac816 100644 --- a/lib/common/widgets/spring_physics.dart +++ b/lib/common/widgets/spring_physics.dart @@ -1,5 +1,15 @@ -import 'package:flutter/cupertino.dart'; import 'package:PiliPlus/utils/storage.dart'; +import 'package:flutter/material.dart'; + +Widget tabBarView({ + required List children, + TabController? controller, +}) => + TabBarView( + physics: customTabBarViewScrollPhysics, + controller: controller, + children: children, + ); class CustomTabBarViewScrollPhysics extends ScrollPhysics { CustomTabBarViewScrollPhysics({super.parent}); @@ -9,12 +19,14 @@ class CustomTabBarViewScrollPhysics extends ScrollPhysics { return CustomTabBarViewScrollPhysics(parent: buildParent(ancestor)!); } + final springDescription = GStorage.springDescription; + @override - SpringDescription spring = SpringDescription( - mass: GStorage.springDescription[0], - stiffness: GStorage.springDescription[1], - damping: GStorage.springDescription[2] - ); + SpringDescription get spring => SpringDescription( + mass: springDescription[0], + stiffness: springDescription[1], + damping: springDescription[2], + ); } -final customTabBarViewScrollPhysics = CustomTabBarViewScrollPhysics(); \ No newline at end of file +final customTabBarViewScrollPhysics = CustomTabBarViewScrollPhysics(); diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index 300e35ee7..d32dfa4d4 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -162,8 +162,7 @@ class _BangumiPageState extends State .map((title) => Tab(text: title)) .toList()), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( children: types .map((type) => PgcIndexPage(indexType: type)) diff --git a/lib/pages/danmaku_block/index.dart b/lib/pages/danmaku_block/index.dart index d3f6c68ac..c34641f7b 100644 --- a/lib/pages/danmaku_block/index.dart +++ b/lib/pages/danmaku_block/index.dart @@ -142,8 +142,7 @@ class _DanmakuBlockPageState extends State { '${ruleLabels[i]}(${_danmakuBlockController.ruleTypes[i]!.length})')), ]), ), - body: TabBarView( - physics: customTabBarViewScrollPhysics, + body: tabBarView( controller: _danmakuBlockController.tabController, children: [ for (var i = 0; i < ruleLabels.length; i++) diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index d682a2f6d..bfb6b6a9e 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -183,8 +183,7 @@ class _DynamicsPageState extends State body: Row(children: [ if (upPanelPosition == UpPanelPosition.leftFixed) upPanelPart(), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _dynamicsController.tabController, children: _dynamicsController.tabsPageList, )), diff --git a/lib/pages/emote/view.dart b/lib/pages/emote/view.dart index a8e08f880..7c8a886cb 100644 --- a/lib/pages/emote/view.dart +++ b/lib/pages/emote/view.dart @@ -36,8 +36,7 @@ class _EmotePanelState extends State ? Column( children: [ Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _emotePanelController.tabController, children: (loadingState.response as List).map( (e) { diff --git a/lib/pages/follow/view.dart b/lib/pages/follow/view.dart index 1cdec44c7..49675162d 100644 --- a/lib/pages/follow/view.dart +++ b/lib/pages/follow/view.dart @@ -83,8 +83,7 @@ class _FollowPageState extends State { ] ]), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _followController.tabController, children: [ for (var i = 0; diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index 7c81ae3f3..3cce1ddbb 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -73,8 +73,7 @@ class _HomePageState extends State ] else const SizedBox(height: 6), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _homeController.tabController, children: _homeController.tabsPageList, ), diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 5b7d31e92..9fc1c371c 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/widgets/spring_physics.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -538,8 +539,7 @@ class _LoginPageState extends State { } return true; }, - child: TabBarView( - physics: const AlwaysScrollableScrollPhysics(), + child: tabBarView( controller: _loginPageCtr.tabController, children: [ tabViewOuter(loginByPassword()), diff --git a/lib/pages/member/new/member_page.dart b/lib/pages/member/new/member_page.dart index 24a64041b..1919af254 100644 --- a/lib/pages/member/new/member_page.dart +++ b/lib/pages/member/new/member_page.dart @@ -151,8 +151,7 @@ class _MemberPageNewState extends State Widget get _buildBody => SafeArea( top: false, bottom: false, - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _userController.tabController, children: _userController.tab2!.map((item) { return switch (item.param!) { diff --git a/lib/pages/member_search/view.dart b/lib/pages/member_search/view.dart index 0c8bc25a1..d8b86d2f2 100644 --- a/lib/pages/member_search/view.dart +++ b/lib/pages/member_search/view.dart @@ -69,8 +69,7 @@ class _MemberSearchPageState extends State { ), ), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _memberSearchCtr.tabController, children: [ SearchArchive(ctr: _memberSearchCtr), diff --git a/lib/pages/search_result/view.dart b/lib/pages/search_result/view.dart index 1596e2b98..36ce06a82 100644 --- a/lib/pages/search_result/view.dart +++ b/lib/pages/search_result/view.dart @@ -119,8 +119,7 @@ class _SearchResultPageState extends State ), ), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: _tabController, children: SearchType.values .map( diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 1f35c227f..9a44f6814 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -542,7 +542,8 @@ List get styleSettings => [ leading: const Icon(Icons.chrome_reader_mode_outlined), onTap: (setState) { final numberRegExp = RegExp(r'[\d\.]+'); - List springDescription = GStorage.springDescription.map((i) => i.toString()).toList(); + List springDescription = + GStorage.springDescription.map((i) => i.toString()).toList(); showDialog( context: Get.context!, builder: (context) { @@ -550,32 +551,28 @@ List get styleSettings => [ title: const Text('弹簧参数'), content: Column( mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - autofocus: true, - initialValue: springDescription[0], - keyboardType: TextInputType.numberWithOptions(), - onChanged: (value) { springDescription[0] = value; }, - inputFormatters: [FilteringTextInputFormatter.allow(numberRegExp)], - decoration: InputDecoration(labelText: 'mass'), + children: List.generate( + 3, + (index) => TextFormField( + autofocus: index == 0, + initialValue: springDescription[index], + keyboardType: + TextInputType.numberWithOptions(decimal: true), + onChanged: (value) { + springDescription[index] = value; + }, + inputFormatters: [ + FilteringTextInputFormatter.allow(numberRegExp) + ], + decoration: InputDecoration( + labelText: const [ + 'mass', + 'stiffness', + 'damping' + ][index], + ), ), - TextFormField( - autofocus: true, - initialValue: springDescription[1], - keyboardType: TextInputType.numberWithOptions(), - onChanged: (value) { springDescription[1] = value; }, - inputFormatters: [FilteringTextInputFormatter.allow(numberRegExp)], - decoration: InputDecoration(labelText: 'stiffness'), - ), - TextFormField( - autofocus: true, - initialValue: springDescription[2], - keyboardType: TextInputType.numberWithOptions(), - onChanged: (value) { springDescription[2] = value; }, - inputFormatters: [FilteringTextInputFormatter.allow(numberRegExp)], - decoration: InputDecoration(labelText: 'damping'), - ) - ] + ), ), actions: [ TextButton( @@ -590,9 +587,15 @@ List get styleSettings => [ TextButton( onPressed: () async { Get.back(); + late final spring = GStorage.springDescription; await GStorage.setting.put( SettingBoxKey.springDescription, - List.generate(3, (i) => double.tryParse(springDescription[i]) ?? GStorage.springDescription[i]), + List.generate( + 3, + (i) => + double.tryParse(springDescription[i]) ?? + spring[i], + ), ); SmartDialog.showToast('设置成功,重启生效'); setState(); diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 2d36719c3..2b7dc0a46 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -621,8 +621,7 @@ class _VideoDetailPageState extends State showReply: videoDetailController.showReply, ), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: videoDetailController.tabCtr, children: [ videoIntro(), @@ -672,8 +671,7 @@ class _VideoDetailPageState extends State children: [ buildTabbar(showReply: videoDetailController.showReply), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: videoDetailController.tabCtr, children: [ videoIntro(), @@ -772,8 +770,7 @@ class _VideoDetailPageState extends State showReply: videoDetailController.showReply, ), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: videoDetailController.tabCtr, children: [ if (videoDetailController.showReply) @@ -882,8 +879,7 @@ class _VideoDetailPageState extends State showReply: videoDetailController.showReply, ), Expanded( - child: TabBarView( - physics: customTabBarViewScrollPhysics, + child: tabBarView( controller: videoDetailController.tabCtr, children: [ if (videoDetailController.videoType == diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 5bea1008c..3fa99bddb 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:math'; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart' show kDragContainerExtentPercentage, displacement; @@ -415,11 +416,18 @@ class GStorage { }; } - static final _defaultSpring = const ClampingScrollPhysics().spring; - - static final List springDescription = setting - .get(SettingBoxKey.springDescription, - defaultValue: [_defaultSpring.mass, _defaultSpring.stiffness, _defaultSpring.damping]); + // static final SpringDescription _kDefaultSpring = SpringDescription.withDampingRatio( + // mass: 0.5, + // stiffness: 100.0, + // ratio: 1.1, + // ); + // damping = ratio * 2.0 * math.sqrt(mass * stiffness) + static List get springDescription => List.from( + setting.get( + SettingBoxKey.springDescription, // [mass, stiffness, damping] + defaultValue: [0.5, 100.0, 2.2 * sqrt(50)], + ), + ); // static Brightness get brightness { // return switch (_themeMode) {