Skip to content

Commit

Permalink
fix: Added MasamuneAdapterScope.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Feb 16, 2023
1 parent edc434e commit 24ec91e
Show file tree
Hide file tree
Showing 5 changed files with 241 additions and 95 deletions.
54 changes: 27 additions & 27 deletions packages/masamune/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: "569ddca58d535e601dd1584afa117710abc999d036c0cd2c51777fb257df78e8"
url: "https://pub.dev"
source: hosted
version: "52.0.0"
version: "53.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4
sha256: "10927c4b7c7c88b1adbca278c3d5531db92e2f4b4abf04e2919a800af965f3f5"
url: "https://pub.dev"
source: hosted
version: "5.4.0"
version: "5.5.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 @@ -393,10 +393,10 @@ packages:
dependency: transitive
description:
name: katana_auth
sha256: "880c1dde0d7c610635c573537f216564634439b1a46d95e5ab44aef68b67525b"
sha256: "523bb2179abe70ed306e97dbdd35e3ae62ee66ba8a1510be359bbee7d88e1397"
url: "https://pub.dev"
source: hosted
version: "1.2.5"
version: "1.2.6"
katana_form:
dependency: transitive
description:
Expand Down Expand Up @@ -449,34 +449,34 @@ packages:
dependency: transitive
description:
name: katana_localization
sha256: "0c0086dd931f6f16d26951b5aaf2b2537bf9a64059c21e290393c15d767284aa"
sha256: a10df2a92cd3180e9e4d3e7a2466ddb41f41b1516402ad25a3e58bbf8f0cd296
url: "https://pub.dev"
source: hosted
version: "1.1.26"
version: "1.1.27"
katana_localization_annotation:
dependency: transitive
description:
name: katana_localization_annotation
sha256: d90d6dd07a4c1f4e13d2c781aea46306a7de20a4ae574f5882b18b05703611a8
sha256: "769bd9b56b571a135a86d4e962cbecd7ab8dfb579d0383c6880d5d13b6667041"
url: "https://pub.dev"
source: hosted
version: "1.1.24"
version: "1.1.25"
katana_localization_builder:
dependency: transitive
description:
name: katana_localization_builder
sha256: "7dbf0a5e434b304c483f5e4a3ce2fec82dfa0aac0b1b19dc381808bef6f7d24d"
sha256: "9b8bf81bbe89ce54b21abd5e0e4a4632fcb1599b7beb25a1cdbc739bb4b8a51b"
url: "https://pub.dev"
source: hosted
version: "1.1.26"
version: "1.1.27"
katana_logger:
dependency: transitive
description:
name: katana_logger
sha256: "38231bb682d13d3570eef440689f9fc7976c66f68c55f58a7f5c3ec378e32837"
sha256: afd1a1d8681be44bfc8df20233da00b74d074f52d4aae98eb52ddfd23f312798
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.2.3"
katana_model:
dependency: transitive
description:
Expand Down Expand Up @@ -513,10 +513,10 @@ packages:
dependency: transitive
description:
name: katana_router
sha256: "8575d8bcc16a9ce3c1000499f40034c8c930b2d8b03388f30a1bad454fa1a259"
sha256: c6ff449b32af8979dff87f3278f5e21635948a0eeb758ffc7ef274a0ba18a599
url: "https://pub.dev"
source: hosted
version: "1.11.3"
version: "1.11.4"
katana_router_annotation:
dependency: transitive
description:
Expand All @@ -537,10 +537,10 @@ packages:
dependency: transitive
description:
name: katana_scoped
sha256: "734872e949962424a408847f81668ced85bac6914b4ac7db475e40a5ad65dcb6"
sha256: "4f1dbd741da4a6a13f2c9b9ac3d6ed31ab897e2e1cf2ea801acb5181bac3113f"
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.8.3"
katana_shorten:
dependency: transitive
description:
Expand Down Expand Up @@ -611,7 +611,7 @@ packages:
path: ".."
relative: true
source: path
version: "1.6.2"
version: "1.6.4"
masamune_annotation:
dependency: transitive
description:
Expand All @@ -626,7 +626,7 @@ packages:
path: "../../masamune_builder"
relative: true
source: path
version: "1.3.6"
version: "1.3.7"
matcher:
dependency: transitive
description:
Expand Down Expand Up @@ -703,10 +703,10 @@ packages:
dependency: transitive
description:
name: path_provider_linux
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9"
url: "https://pub.dev"
source: hosted
version: "2.1.7"
version: "2.1.8"
path_provider_platform_interface:
dependency: transitive
description:
Expand Down Expand Up @@ -1020,10 +1020,10 @@ packages:
dependency: transitive
description:
name: xdg_directories
sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
url: "https://pub.dev"
source: hosted
version: "0.2.0+3"
version: "1.0.0"
yaml:
dependency: transitive
description:
Expand All @@ -1033,5 +1033,5 @@ packages:
source: hosted
version: "3.1.1"
sdks:
dart: ">=2.19.0 <4.0.0"
dart: ">=2.19.0 <3.0.0"
flutter: ">=3.0.0"
148 changes: 147 additions & 1 deletion packages/masamune/lib/src/masamune_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,18 @@ abstract class MasamuneAdapter {
/// [app][MasamuneApp]内で生成されたウィジェットが渡されます。
///
/// [Widget]を返すとそのウィジェットがビルドされます。
Widget onBuildApp(BuildContext context, Widget app);
Widget onBuildApp(BuildContext context, Widget app) {
return MasamuneAdapterScope(adapter: this, onInit: onInitScope, child: app);
}

/// Called when initializing [MasamuneAdapterScope].
///
/// It is possible to describe processes such as receiving an `[adapter]' and making it a `primary` adapter.
///
/// [MasamuneAdapterScope]を初期化するときに呼ばれます。
///
/// [adapter]を受け取って`primary`のアダプターにするなどの処理を記述することができます。
void onInitScope(MasamuneAdapter adapter) {}

/// You can describe the process before [runApp].
///
Expand All @@ -91,3 +102,138 @@ abstract class MasamuneAdapter {
/// [error][stackTrace]にエラーが起きた際のオブジェクトが渡されます。
void onError(Object error, StackTrace stackTrace);
}

/// [MasamuneAdapter] for the entire app by placing it on top of [MaterialApp], etc.
///
/// Pass [MasamuneAdapter] to [adapter].
///
/// Also, by using [MasamuneAdapterScope.of] in a descendant widget, you can retrieve the [MasamuneAdapter] set in the [MasamuneAdapterScope].
///
/// [MaterialApp]などの上に配置して、アプリ全体に[MasamuneAdapter]を設定します。
///
/// [adapter][MasamuneAdapter]を渡してください。
///
/// また[MasamuneAdapterScope.of]を子孫のウィジェット内で利用することにより[MasamuneAdapterScope]で設定された[MasamuneAdapter]を取得することができます。
///
/// ```dart
/// class MyApp extends StatelessWidget {
/// const MyApp({super.key});
///
/// @override
/// Widget build(BuildContext context) {
/// return MasamuneAdapterScope(
/// adapter: const FileMasamuneAdapter(),
/// child: MaterialApp(
/// home: const PickerPage(),
/// ),
/// );
/// }
/// }
/// ```
class MasamuneAdapterScope<TAdapter extends MasamuneAdapter>
extends StatefulWidget {
/// [MasamuneAdapter] for the entire app by placing it on top of [MaterialApp], etc.
///
/// Pass [MasamuneAdapter] to [adapter].
///
/// Also, by using [MasamuneAdapterScope.of] in a descendant widget, you can retrieve the [MasamuneAdapter] set in the [MasamuneAdapterScope].
///
/// [MaterialApp]などの上に配置して、アプリ全体に[MasamuneAdapter]を設定します。
///
/// [adapter][MasamuneAdapter]を渡してください。
///
/// また[MasamuneAdapterScope.of]を子孫のウィジェット内で利用することにより[MasamuneAdapterScope]で設定された[MasamuneAdapter]を取得することができます。
///
/// ```dart
/// class MyApp extends StatelessWidget {
/// const MyApp({super.key});
///
/// @override
/// Widget build(BuildContext context) {
/// return MasamuneAdapterScope(
/// adapter: const FileMasamuneAdapter(),
/// child: MaterialApp(
/// home: const PickerPage(),
/// ),
/// );
/// }
/// }
/// ```
const MasamuneAdapterScope({
super.key,
this.onInit,
required this.child,
required this.adapter,
});

/// Children's widget.
///
/// 子供のウィジェット。
final Widget child;

/// [MasamuneAdapter] to be configured for the entire app.
///
/// アプリ全体に設定する[MasamuneAdapter]
final TAdapter adapter;

/// Describe the process when this widget is initialized.
///
/// [MasamuneAdapter] is passed to [adapter].
///
/// このウィジェットが初期化されたときの処理を記述します。
///
/// [adapter][MasamuneAdapter]が渡されます。
final void Function(TAdapter adapter)? onInit;

/// By passing [context], the [MasamuneAdapter] set in [MasamuneAdapterScope] can be obtained.
///
/// If the ancestor does not have [MasamuneAdapterScope], an error will occur.
///
/// [context]を渡すことにより[MasamuneAdapterScope]で設定された[MasamuneAdapter]を取得することができます。
///
/// 祖先に[MasamuneAdapterScope]がない場合はエラーになります。
static TAdapter? of<TAdapter extends MasamuneAdapter>(BuildContext context) {
final scope = context.getElementForInheritedWidgetOfExactType<
_MasamuneAdapterScope<TAdapter>>();
assert(
scope != null,
"MasamuneAdapterScope<TAdapter> is not found. Place [MasamuneAdapterScope<TAdapter>] widget closer to the root.",
);
return (scope?.widget as _MasamuneAdapterScope<TAdapter>?)?.adapter;
}

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

class _MasamuneAdapterScopeState<TAdapter extends MasamuneAdapter>
extends State<MasamuneAdapterScope<TAdapter>> {
@override
void initState() {
super.initState();
widget.onInit?.call(widget.adapter);
}

@override
Widget build(BuildContext context) {
return _MasamuneAdapterScope<TAdapter>(
adapter: widget.adapter,
child: widget.child,
);
}
}

class _MasamuneAdapterScope<TAdapter extends MasamuneAdapter>
extends InheritedWidget {
const _MasamuneAdapterScope({
required super.child,
required this.adapter,
});

final TAdapter adapter;

@override
bool updateShouldNotify(
covariant _MasamuneAdapterScope<TAdapter> oldWidget) =>
false;
}

0 comments on commit 24ec91e

Please sign in to comment.