Browse Source

neon: use AdaptiveLayout for the home page

pull/441/head
Nikolas Rimikis 2 years ago
parent
commit
2258c76116
No known key found for this signature in database
GPG Key ID: 85ED1DE9786A4FF2
  1. 12
      packages/app/pubspec.lock
  2. 2
      packages/neon/neon/lib/neon.dart
  3. 83
      packages/neon/neon/lib/src/pages/home.dart
  4. 4
      packages/neon/neon/lib/src/utils/app_implementation.dart
  5. 1
      packages/neon/neon/pubspec.yaml

12
packages/app/pubspec.lock

@ -101,10 +101,10 @@ packages:
dependency: transitive
description:
name: cookie_jar
sha256: "823fd13d22c5cf0c846e8a31c9b276f768f423cca134990c22c33045462f8ef9"
sha256: "1024f3a52bee181fc8f10f4a359085471587d7406323090a53a7171bc0aa5c37"
url: "https://pub.dev"
source: hosted
version: "4.0.3"
version: "4.0.5"
cross_file:
dependency: transitive
description:
@ -244,6 +244,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_adaptive_scaffold:
dependency: transitive
description:
name: flutter_adaptive_scaffold
sha256: "01ee32a8f64b68f15436b5e59124e79df9c46bbffe7bbb6edb8ae93d879511fb"
url: "https://pub.dev"
source: hosted
version: "0.1.5"
flutter_cache_manager:
dependency: transitive
description:

2
packages/neon/neon/lib/neon.dart

@ -13,6 +13,7 @@ import 'package:filesize/filesize.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_file_dialog/flutter_file_dialog.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
@ -27,6 +28,7 @@ import 'package:neon/src/models/account.dart';
import 'package:neon/src/models/push_notification.dart';
import 'package:neon/src/router.dart';
import 'package:neon/src/widgets/app_bar.dart';
import 'package:neon/src/widgets/app_tab_bar.dart';
import 'package:neon/src/widgets/drawer.dart';
import 'package:neon/src/widgets/drawer_destination.dart';
import 'package:nextcloud/nextcloud.dart';

83
packages/neon/neon/lib/src/pages/home.dart

@ -15,7 +15,6 @@ class _HomePageState extends State<HomePage> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
late Account _account;
late GlobalOptions _globalOptions;
late AccountsBloc _accountsBloc;
late AppsBloc _appsBloc;
late StreamSubscription _versionCheckSubscription;
@ -23,7 +22,6 @@ class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
_globalOptions = Provider.of<GlobalOptions>(context, listen: false);
_accountsBloc = Provider.of<AccountsBloc>(context, listen: false);
_account = _accountsBloc.activeAccount.value!;
_appsBloc = _accountsBloc.activeAppsBloc;
@ -101,9 +99,6 @@ class _HomePageState extends State<HomePage> {
@override
Widget build(final BuildContext context) {
const drawer = NeonDrawer();
const appBar = NeonAppBar();
final appView = ResultBuilder<Iterable<AppImplementation>>.behaviorSubject(
stream: _appsBloc.appImplementations,
builder: (final context, final appImplementations) {
@ -127,38 +122,62 @@ class _HomePageState extends State<HomePage> {
return const SizedBox();
}
return activeAppIDSnapshot.requireData.page;
final view = activeAppIDSnapshot.requireData.page;
final topNavigation = SlotLayout(
config: {
Breakpoints.standard: SlotLayout.from(
key: const Key('Standard topNavigation'),
builder: (final _) => const SizedBox(
height: kToolbarHeight,
child: NeonAppBar(),
),
),
Breakpoints.large: SlotLayout.from(
key: const Key('Large topNavigation'),
builder: (final _) => const NeonTabBar(),
),
if (view is AdaptiveLayout) ...{
...?view.topNavigation?.config,
},
},
);
if (view is! AdaptiveLayout) {
final body = SlotLayout(
config: {
Breakpoints.standard: SlotLayout.from(
key: const Key('Standard body'),
builder: (final _) => view,
),
},
);
return AdaptiveLayout(
topNavigation: topNavigation,
body: body,
);
}
return AdaptiveLayout(
topNavigation: topNavigation,
primaryNavigation: view.primaryNavigation,
secondaryNavigation: view.secondaryNavigation,
bottomNavigation: view.bottomNavigation,
body: view.body,
secondaryBody: view.secondaryBody,
bodyRatio: view.bodyRatio,
internalAnimations: view.internalAnimations,
bodyOrientation: view.bodyOrientation,
);
},
);
},
);
final body = OptionBuilder<NavigationMode>(
option: _globalOptions.navigationMode,
builder: (final context, final navigationMode) {
final drawerAlwaysVisible = navigationMode == NavigationMode.drawerAlwaysVisible;
final body = Scaffold(
key: _scaffoldKey,
resizeToAvoidBottomInset: false,
drawer: !drawerAlwaysVisible ? drawer : null,
appBar: appBar,
body: appView,
);
if (drawerAlwaysVisible) {
return Row(
children: [
drawer,
Expanded(
child: body,
),
],
);
}
return body;
},
final body = Scaffold(
key: _scaffoldKey,
drawer: const NeonDrawer(),
body: appView,
);
return WillPopScope(

4
packages/neon/neon/lib/src/utils/app_implementation.dart

@ -39,6 +39,10 @@ abstract class AppImplementation<T extends Bloc, R extends NextcloudAppSpecificO
BehaviorSubject<int>? getUnreadCounter(final T bloc) => null;
/// Main view of the app.
///
/// It is encuraged to use an [AdaptiveLayout] to adapt the page to different
/// screen sizes and layouts.
Widget get page;
NeonNavigationDestination destination(final BuildContext context) {

1
packages/neon/neon/pubspec.yaml

@ -14,6 +14,7 @@ dependencies:
filesize: ^2.0.1
flutter:
sdk: flutter
flutter_adaptive_scaffold: ^0.1.5
flutter_cache_manager: ^3.3.0
flutter_file_dialog: ^3.0.0
flutter_local_notifications: ^14.0.0+2

Loading…
Cancel
Save