Skip to content

Commit

Permalink
feat(master-detail): expose Navigator properties (#735)
Browse files Browse the repository at this point in the history
To bring YaruMasterDetailPage on par with YaruNavigationPage.
  • Loading branch information
jpnurmi committed Jul 24, 2023
1 parent 41850d8 commit f30b8d5
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 3 deletions.
13 changes: 12 additions & 1 deletion lib/src/widgets/master_detail/yaru_landscape_layout.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ class YaruLandscapeLayout extends StatefulWidget {
const YaruLandscapeLayout({
super.key,
required this.navigatorKey,
this.navigatorObservers = const <NavigatorObserver>[],
this.initialRoute,
this.onGenerateRoute,
this.onUnknownRoute,
required this.tileBuilder,
required this.pageBuilder,
this.onSelected,
Expand All @@ -26,6 +30,10 @@ class YaruLandscapeLayout extends StatefulWidget {
});

final GlobalKey<NavigatorState> navigatorKey;
final List<NavigatorObserver> navigatorObservers;
final String? initialRoute;
final RouteFactory? onGenerateRoute;
final RouteFactory? onUnknownRoute;
final YaruMasterTileBuilder tileBuilder;
final IndexedWidgetBuilder pageBuilder;
final ValueChanged<int>? onSelected;
Expand Down Expand Up @@ -191,6 +199,9 @@ class _YaruLandscapeLayoutState extends State<YaruLandscapeLayout> {
child: ScaffoldMessenger(
child: Navigator(
key: widget.navigatorKey,
initialRoute: widget.initialRoute,
onGenerateRoute: widget.onGenerateRoute,
onUnknownRoute: widget.onUnknownRoute,
pages: [
MaterialPage(
key: ValueKey(_selectedIndex),
Expand All @@ -202,7 +213,7 @@ class _YaruLandscapeLayoutState extends State<YaruLandscapeLayout> {
),
],
onPopPage: (route, result) => route.didPop(result),
observers: [HeroController()],
observers: [...widget.navigatorObservers, HeroController()],
),
),
);
Expand Down
43 changes: 42 additions & 1 deletion lib/src/widgets/master_detail/yaru_master_detail_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ class YaruMasterDetailPage extends StatefulWidget {
this.initialIndex,
this.onSelected,
this.controller,
this.navigatorKey,
this.navigatorObservers = const <NavigatorObserver>[],
this.initialRoute,
this.onGenerateRoute,
this.onUnknownRoute,
}) : assert(initialIndex == null || controller == null),
assert((length == null) != (controller == null));

Expand Down Expand Up @@ -115,6 +120,33 @@ class YaruMasterDetailPage extends StatefulWidget {
/// An optional controller that can be used to navigate to a specific index.
final YaruPageController? controller;

/// A key to use when building the [Navigator] widget.
final GlobalKey<NavigatorState>? navigatorKey;

/// A list of observers for the [Navigator] widget.
///
/// See also:
/// * [Navigator.observers]
final List<NavigatorObserver> navigatorObservers;

/// The route name for the initial route.
///
/// See also:
/// * [Navigator.initialRoute]
final String? initialRoute;

/// Called to generate a route for a given [RouteSettings].
///
/// See also:
/// * [Navigator.onGenerateRoute]
final RouteFactory? onGenerateRoute;

/// Called when [onGenerateRoute] fails to generate a route.
///
/// See also:
/// * [Navigator.onUnknownRoute]
final RouteFactory? onUnknownRoute;

/// Returns the orientation of the [YaruMasterDetailPage] that most tightly
/// encloses the given context.
static Orientation orientationOf(BuildContext context) {
Expand All @@ -136,7 +168,7 @@ class YaruMasterDetailPage extends StatefulWidget {
class _YaruMasterDetailPageState extends State<YaruMasterDetailPage> {
double? _previousPaneWidth;
late YaruPageController _controller;
final _navigatorKey = GlobalKey<NavigatorState>();
late final GlobalKey<NavigatorState> _navigatorKey;

void _updateController() => _controller = widget.controller ??
YaruPageController(
Expand All @@ -148,6 +180,7 @@ class _YaruMasterDetailPageState extends State<YaruMasterDetailPage> {
void initState() {
super.initState();
_updateController();
_navigatorKey = widget.navigatorKey ?? GlobalKey<NavigatorState>();
}

@override
Expand All @@ -174,6 +207,10 @@ class _YaruMasterDetailPageState extends State<YaruMasterDetailPage> {
: _YaruMasterDetailLayoutBuilder(
portrait: (context) => YaruPortraitLayout(
navigatorKey: _navigatorKey,
navigatorObservers: widget.navigatorObservers,
initialRoute: widget.initialRoute,
onGenerateRoute: widget.onGenerateRoute,
onUnknownRoute: widget.onUnknownRoute,
tileBuilder: widget.tileBuilder,
pageBuilder: widget.pageBuilder,
onSelected: widget.onSelected,
Expand All @@ -183,6 +220,10 @@ class _YaruMasterDetailPageState extends State<YaruMasterDetailPage> {
),
landscape: (context) => YaruLandscapeLayout(
navigatorKey: _navigatorKey,
navigatorObservers: widget.navigatorObservers,
initialRoute: widget.initialRoute,
onGenerateRoute: widget.onGenerateRoute,
onUnknownRoute: widget.onUnknownRoute,
tileBuilder: widget.tileBuilder,
pageBuilder: widget.pageBuilder,
onSelected: widget.onSelected,
Expand Down
13 changes: 12 additions & 1 deletion lib/src/widgets/master_detail/yaru_portrait_layout.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ class YaruPortraitLayout extends StatefulWidget {
const YaruPortraitLayout({
super.key,
required this.navigatorKey,
this.navigatorObservers = const <NavigatorObserver>[],
this.initialRoute,
this.onGenerateRoute,
this.onUnknownRoute,
required this.tileBuilder,
required this.pageBuilder,
this.onSelected,
Expand All @@ -21,6 +25,10 @@ class YaruPortraitLayout extends StatefulWidget {
});

final GlobalKey<NavigatorState> navigatorKey;
final List<NavigatorObserver> navigatorObservers;
final String? initialRoute;
final RouteFactory? onGenerateRoute;
final RouteFactory? onUnknownRoute;
final YaruMasterTileBuilder tileBuilder;
final IndexedWidgetBuilder pageBuilder;
final ValueChanged<int>? onSelected;
Expand Down Expand Up @@ -93,6 +101,9 @@ class _YaruPortraitLayoutState extends State<YaruPortraitLayout> {
),
child: Navigator(
key: widget.navigatorKey,
initialRoute: widget.initialRoute,
onGenerateRoute: widget.onGenerateRoute,
onUnknownRoute: widget.onUnknownRoute,
onPopPage: (route, result) {
_selectedIndex = -1;
return route.didPop(result);
Expand Down Expand Up @@ -123,7 +134,7 @@ class _YaruPortraitLayoutState extends State<YaruPortraitLayout> {
),
if (_selectedIndex != -1) page(_selectedIndex)
],
observers: [HeroController()],
observers: [...widget.navigatorObservers, HeroController()],
),
),
);
Expand Down

0 comments on commit f30b8d5

Please sign in to comment.