Skip to content

Commit

Permalink
fix: Creation of ScrollBuilder.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Mar 1, 2023
1 parent 12c1a68 commit 515f614
Show file tree
Hide file tree
Showing 5 changed files with 196 additions and 55 deletions.
64 changes: 36 additions & 28 deletions packages/katana_ui/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,26 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201"
sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9
url: "https://pub.dev"
source: hosted
version: "52.0.0"
version: "54.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4
sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427"
url: "https://pub.dev"
source: hosted
version: "5.4.0"
version: "5.6.0"
args:
dependency: transitive
description:
name: args
sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.4.0"
asn1lib:
dependency: transitive
description:
Expand Down Expand Up @@ -69,18 +69,18 @@ packages:
dependency: transitive
description:
name: build_daemon
sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf"
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.1.1"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab"
sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.2.0"
build_runner:
dependency: "direct dev"
description:
Expand Down Expand Up @@ -213,10 +213,10 @@ packages:
dependency: transitive
description:
name: fixnum
sha256: "04be3e934c52e082558cc9ee21f42f5c1cd7a1262f4c63cd0357c08d5bba81ec"
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
version: "1.1.0"
flutter:
dependency: "direct main"
description: flutter
Expand Down Expand Up @@ -343,25 +343,25 @@ packages:
dependency: "direct dev"
description:
name: json_serializable
sha256: "040088d9eb2337f3a51ddabe35261e2fea1c351e3dd29d755ed1290b6b700a75"
sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a
url: "https://pub.dev"
source: hosted
version: "6.6.0"
version: "6.6.1"
katana:
dependency: transitive
description:
name: katana
sha256: "7b36ca7674eb8dfa824cc84aa58f06ff4cc51cf6ac5ebd92b317152d83793c81"
sha256: "9a3ec047c35ec88e027139e88ce45202b022dd2111b38848c85159101b0028ce"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "1.0.5"
katana_ui:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "1.1.5"
version: "1.1.8"
lints:
dependency: transitive
description:
Expand All @@ -374,10 +374,10 @@ packages:
dependency: transitive
description:
name: logging
sha256: c0bbfe94d46aedf9b8b3e695cf3bd48c8e14b35e3b2c639e0aa7755d589ba946
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.1.1"
matcher:
dependency: transitive
description:
Expand Down Expand Up @@ -454,10 +454,10 @@ packages:
dependency: transitive
description:
name: pubspec_parse
sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a"
sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
recase:
dependency: transitive
description:
Expand Down Expand Up @@ -491,10 +491,10 @@ packages:
dependency: transitive
description:
name: source_gen
sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d"
sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298
url: "https://pub.dev"
source: hosted
version: "1.2.6"
version: "1.2.7"
source_helper:
dependency: transitive
description:
Expand All @@ -515,10 +515,10 @@ packages:
dependency: transitive
description:
name: sprintf
sha256: ec76d38910b6f1c854ce1353c62d37e7ef82b53dc5ab048c25400d35970776d1
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
url: "https://pub.dev"
source: hosted
version: "6.0.2"
version: "7.0.0"
stack_trace:
dependency: transitive
description:
Expand Down Expand Up @@ -579,10 +579,10 @@ packages:
dependency: transitive
description:
name: tint
sha256: d856019547532d4ea24171f554b319081c004c37741e7946eae30cb09f24e1c7
sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "2.0.1"
typed_data:
dependency: transitive
description:
Expand All @@ -591,6 +591,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
universal_platform:
dependency: transitive
description:
name: universal_platform
sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc
url: "https://pub.dev"
source: hosted
version: "1.0.0+1"
uuid:
dependency: transitive
description:
Expand Down Expand Up @@ -632,5 +640,5 @@ packages:
source: hosted
version: "3.1.1"
sdks:
dart: ">=2.18.1 <4.0.0"
dart: ">=2.19.0 <3.0.0"
flutter: ">=2.0.0"
3 changes: 3 additions & 0 deletions packages/katana_ui/lib/katana_ui.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ library katana_ui;
import 'dart:async';

// Flutter imports:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide Scaffold;
import 'package:universal_platform/universal_platform.dart';

export 'package:katana/katana.dart';

part 'modal/modal.dart';
part 'ui/loading_builder.dart';
part 'ui/scroll_builder.dart';
121 changes: 121 additions & 0 deletions packages/katana_ui/lib/ui/scroll_builder.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
part of katana_ui;

/// This widget can be placed on top of a [ListView] or [SingleChildScrollView] to easily add a [RefreshIndicator] or [Scrollbar].
///
/// If [showScrollbarWhenPCorWeb] is `true`, a mouse scrollable scrollbar will be displayed only on PC or Web.
///
/// If [onRefresh] is not [null], a [RefreshIndicator] will be placed and Pull to Refresh will be enabled.
///
/// Please pass a [ListView] or [SingleChildScrollView] to [builder].
///
/// An internal [ScrollController] is created and passed to [builder]. If you want to specify your own [ScrollController], pass it to [controller].
///
/// [ListView][SingleChildScrollView]の上に配置することで、[RefreshIndicator][Scrollbar]を簡単に追加できるようにするためのウィジェットです。
///
/// [showScrollbarWhenPCorWeb]`true`にすると、PCやWebでのみマウスでドラッグ可能なスクロールバーを表示します。
///
/// [onRefresh][null]でない場合、[RefreshIndicator]を配置し、Pull to Refreshを有効にします。
///
/// [builder][ListView][SingleChildScrollView]を渡してください。
///
/// 内部で[ScrollController]が作られ、それが[builder]に渡されます。自身で[ScrollController]を指定したい場合は[controller]に渡してください。
class ScrollBuilder extends StatefulWidget {
/// This widget can be placed on top of a [ListView] or [SingleChildScrollView] to easily add a [RefreshIndicator] or [Scrollbar].
///
/// If [showScrollbarWhenPCorWeb] is `true`, a mouse scrollable scrollbar will be displayed only on PC or Web.
///
/// If [onRefresh] is not [null], a [RefreshIndicator] will be placed and Pull to Refresh will be enabled.
///
/// Please pass a [ListView] or [SingleChildScrollView] to [builder].
///
/// An internal [ScrollController] is created and passed to [builder]. If you want to specify your own [ScrollController], pass it to [controller].
///
/// [ListView][SingleChildScrollView]の上に配置することで、[RefreshIndicator][Scrollbar]を簡単に追加できるようにするためのウィジェットです。
///
/// [showScrollbarWhenPCorWeb]`true`にすると、PCやWebでのみマウスでドラッグ可能なスクロールバーを表示します。
///
/// [onRefresh][null]でない場合、[RefreshIndicator]を配置し、Pull to Refreshを有効にします。
///
/// [builder][ListView][SingleChildScrollView]を渡してください。
///
/// 内部で[ScrollController]が作られ、それが[builder]に渡されます。自身で[ScrollController]を指定したい場合は[controller]に渡してください。
const ScrollBuilder({
super.key,
this.onRefresh,
this.controller,
this.showScrollbarWhenPCorWeb = true,
required this.builder,
});

/// If [onRefresh] is not [null], a [RefreshIndicator] will be placed and Pull to Refresh will be enabled.
///
/// [onRefresh][null]でない場合、[RefreshIndicator]を配置し、Pull to Refreshを有効にします。
final Future<void> Function()? onRefresh;

/// If [showScrollbarWhenPCorWeb] is `true`, a mouse scrollable scrollbar will be displayed only on PC or Web.
///
/// [showScrollbarWhenPCorWeb]`true`にすると、PCやWebでのみマウスでドラッグ可能なスクロールバーを表示します。
final bool showScrollbarWhenPCorWeb;

/// An internal [ScrollController] is created and passed to [builder]. If you want to specify your own [ScrollController], pass it to [controller].
///
/// 内部で[ScrollController]が作られ、それが[builder]に渡されます。自身で[ScrollController]を指定したい場合は[controller]に渡してください。
final ScrollController? controller;

/// Please pass a [ListView] or [SingleChildScrollView] to [builder].
///
/// [builder][ListView][SingleChildScrollView]を渡してください。
final Widget Function(BuildContext context, ScrollController controller)
builder;

@override
State<StatefulWidget> createState() => _ScrollBuilderState();
}

class _ScrollBuilderState extends State<ScrollBuilder> {
late ScrollController _scrollController;

ScrollController get _effectiveScrollController =>
widget.controller ?? _scrollController;

@override
void initState() {
super.initState();
if (widget.controller == null) {
_scrollController = ScrollController();
}
}

Widget _buildRefreshIndicator(BuildContext context, Widget child) {
if (widget.onRefresh != null) {
return RefreshIndicator(
onRefresh: widget.onRefresh!,
child: child,
);
} else {
return child;
}
}

Widget _buildScrollbar(BuildContext context, Widget child) {
if (widget.showScrollbarWhenPCorWeb && UniversalPlatform.isDesktopOrWeb) {
return Scrollbar(
interactive: true,
trackVisibility: true,
thumbVisibility: true,
child: child,
);
} else {
return child;
}
}

@override
Widget build(BuildContext context) {
final child = widget.builder(context, _effectiveScrollController);
return _buildRefreshIndicator(
context,
_buildScrollbar(context, child),
);
}
}

0 comments on commit 515f614

Please sign in to comment.