35 changed files with 2249 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||||||
|
# Miscellaneous |
||||||
|
*.class |
||||||
|
*.log |
||||||
|
*.pyc |
||||||
|
*.swp |
||||||
|
.DS_Store |
||||||
|
.atom/ |
||||||
|
.buildlog/ |
||||||
|
.history |
||||||
|
.svn/ |
||||||
|
migrate_working_dir/ |
||||||
|
|
||||||
|
# IntelliJ related |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
*.iws |
||||||
|
.idea/ |
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in |
||||||
|
# VS Code which you may wish to be included in version control, so this line |
||||||
|
# is commented out by default. |
||||||
|
#.vscode/ |
||||||
|
|
||||||
|
# Flutter/Dart/Pub related |
||||||
|
**/doc/api/ |
||||||
|
**/ios/Flutter/.last_build_id |
||||||
|
.dart_tool/ |
||||||
|
.flutter-plugins |
||||||
|
.flutter-plugins-dependencies |
||||||
|
.packages |
||||||
|
.pub-cache/ |
||||||
|
.pub/ |
||||||
|
/build/ |
||||||
|
|
||||||
|
# Symbolication related |
||||||
|
app.*.symbols |
||||||
|
|
||||||
|
# Obfuscation related |
||||||
|
app.*.map.json |
||||||
|
|
||||||
|
# Android Studio will place build artifacts here |
||||||
|
/android/app/debug |
||||||
|
/android/app/profile |
||||||
|
/android/app/release |
@ -0,0 +1,45 @@ |
|||||||
|
# This file tracks properties of this Flutter project. |
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
||||||
|
# |
||||||
|
# This file should be version controlled. |
||||||
|
|
||||||
|
version: |
||||||
|
revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
channel: stable |
||||||
|
|
||||||
|
project_type: app |
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command |
||||||
|
migration: |
||||||
|
platforms: |
||||||
|
- platform: root |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: android |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: ios |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: linux |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: macos |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: web |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
- platform: windows |
||||||
|
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 |
||||||
|
|
||||||
|
# User provided section |
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be |
||||||
|
# ignored by the migrate tool. |
||||||
|
# |
||||||
|
# Files that are not part of the templates will be ignored by default. |
||||||
|
unmanaged_files: |
||||||
|
- 'lib/main.dart' |
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj' |
@ -0,0 +1,16 @@ |
|||||||
|
# adaptive_layout |
||||||
|
|
||||||
|
A new Flutter project. |
||||||
|
|
||||||
|
## Getting Started |
||||||
|
|
||||||
|
This project is a starting point for a Flutter application. |
||||||
|
|
||||||
|
A few resources to get you started if this is your first Flutter project: |
||||||
|
|
||||||
|
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) |
||||||
|
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) |
||||||
|
|
||||||
|
For help getting started with Flutter development, view the |
||||||
|
[online documentation](https://docs.flutter.dev/), which offers tutorials, |
||||||
|
samples, guidance on mobile development, and a full API reference. |
@ -0,0 +1,6 @@ |
|||||||
|
include: package:nit_picking/flutter.yaml |
||||||
|
|
||||||
|
linter: |
||||||
|
rules: |
||||||
|
prefer_final_parameters: false |
||||||
|
prefer_expression_function_bodies: false |
@ -0,0 +1,22 @@ |
|||||||
|
import 'package:adaptive_layout/src/routes.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
runApp(const MyApp()); |
||||||
|
} |
||||||
|
|
||||||
|
class MyApp extends StatelessWidget { |
||||||
|
const MyApp({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(final BuildContext context) { |
||||||
|
return MaterialApp.router( |
||||||
|
title: 'Adaptive Layout Demo', |
||||||
|
theme: ThemeData( |
||||||
|
primaryColor: Colors.deepPurple, |
||||||
|
useMaterial3: true, |
||||||
|
), |
||||||
|
routerConfig: router, |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/data.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
class NeonAccountSwitcher extends StatefulWidget { |
||||||
|
const NeonAccountSwitcher({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
State<NeonAccountSwitcher> createState() => _NeonAccountSwitcherState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _NeonAccountSwitcherState extends State<NeonAccountSwitcher> { |
||||||
|
int _activeAccount = 0; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final theme = Theme.of(context); |
||||||
|
final colorScheme = theme.colorScheme; |
||||||
|
|
||||||
|
return DropdownButtonHideUnderline( |
||||||
|
child: DropdownButton( |
||||||
|
isExpanded: true, |
||||||
|
dropdownColor: colorScheme.primary, |
||||||
|
iconEnabledColor: colorScheme.onPrimary, |
||||||
|
value: _activeAccount, |
||||||
|
items: const [ |
||||||
|
DropdownMenuItem( |
||||||
|
value: 0, |
||||||
|
child: DrawerItem(name: 'John Doe'), |
||||||
|
), |
||||||
|
DropdownMenuItem( |
||||||
|
value: 1, |
||||||
|
child: DrawerItem(name: 'John Doe Work'), |
||||||
|
), |
||||||
|
], |
||||||
|
onChanged: (id) { |
||||||
|
setState(() { |
||||||
|
_activeAccount = id ?? 0; |
||||||
|
}); |
||||||
|
}, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
class App { |
||||||
|
App({ |
||||||
|
required this.destination, |
||||||
|
required this.route, |
||||||
|
String? routeName, |
||||||
|
}) : assert( |
||||||
|
routeName != null || route is GoRoute && route.name != null, |
||||||
|
'Routename must be specified when the route is not named.', |
||||||
|
), |
||||||
|
routeName = route is GoRoute ? route.name! : routeName!; |
||||||
|
|
||||||
|
final RouteBase route; |
||||||
|
|
||||||
|
final NeonNavigationDestination destination; |
||||||
|
|
||||||
|
final String routeName; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
import 'package:flutter/widgets.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
abstract class NeonAppRoute extends GoRouteData { |
||||||
|
const NeonAppRoute(); |
||||||
|
|
||||||
|
@override |
||||||
|
Page<void> buildPage(BuildContext context, GoRouterState state) { |
||||||
|
return NoTransitionPage( |
||||||
|
// Todo: cache the build to avoid duplicate animations. |
||||||
|
// might turn out against us having every app cached though :thinking: |
||||||
|
child: build(context, state), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
class DrawerItem extends StatelessWidget { |
||||||
|
const DrawerItem({ |
||||||
|
required this.name, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final String name; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final colorScheme = Theme.of(context).colorScheme; |
||||||
|
return ListTile( |
||||||
|
leading: Icon( |
||||||
|
Icons.person_outline, |
||||||
|
color: colorScheme.onPrimary, |
||||||
|
), |
||||||
|
title: Text( |
||||||
|
name, |
||||||
|
style: TextStyle( |
||||||
|
color: colorScheme.onPrimary, |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class NeonDrawerHeader extends StatelessWidget { |
||||||
|
const NeonDrawerHeader({ |
||||||
|
this.name = 'NextCloud', |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final String name; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return SizedBox( |
||||||
|
height: 100, |
||||||
|
child: Padding( |
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 24), |
||||||
|
child: Row( |
||||||
|
children: [ |
||||||
|
const Icon( |
||||||
|
Icons.cloud_outlined, |
||||||
|
size: 60, |
||||||
|
), |
||||||
|
const SizedBox(width: 10), |
||||||
|
Text( |
||||||
|
name, |
||||||
|
style: const TextStyle(fontSize: 25), |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class NeonSettingsDrawerItem extends StatelessWidget { |
||||||
|
const NeonSettingsDrawerItem({ |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return const Padding( |
||||||
|
// maybe drawerdestination |
||||||
|
padding: EdgeInsets.symmetric(horizontal: 28), |
||||||
|
child: Row( |
||||||
|
children: [ |
||||||
|
Icon(Icons.settings_outlined), |
||||||
|
SizedBox(width: 12), |
||||||
|
Text('settings'), |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
class NeonNavigationDestination { |
||||||
|
const NeonNavigationDestination({ |
||||||
|
required this.label, |
||||||
|
required this.icon, |
||||||
|
required this.selectedIcon, |
||||||
|
this.notificationCount = 0, |
||||||
|
}); |
||||||
|
|
||||||
|
final String label; |
||||||
|
final Widget icon; |
||||||
|
final Widget selectedIcon; |
||||||
|
final int notificationCount; |
||||||
|
|
||||||
|
NavigationDestination toDestination() { |
||||||
|
return NavigationDestination( |
||||||
|
label: label, |
||||||
|
icon: icon, |
||||||
|
selectedIcon: selectedIcon, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
NavigationRailDestination toRailDestination() { |
||||||
|
var iconWIdget = icon; |
||||||
|
|
||||||
|
if (notificationCount > 0) { |
||||||
|
iconWIdget = Stack( |
||||||
|
alignment: Alignment.bottomRight, |
||||||
|
children: [ |
||||||
|
Container( |
||||||
|
margin: const EdgeInsets.all(5), |
||||||
|
child: iconWIdget, |
||||||
|
), |
||||||
|
Text(notificationCount.toString()), |
||||||
|
], |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return NavigationRailDestination( |
||||||
|
label: Text(label), |
||||||
|
icon: iconWIdget, |
||||||
|
selectedIcon: selectedIcon, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
NavigationDrawerDestination toDrawerDestination() { |
||||||
|
Widget labelWidget = Text(label); |
||||||
|
|
||||||
|
if (notificationCount > 0) { |
||||||
|
labelWidget = Row( |
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
||||||
|
children: [ |
||||||
|
labelWidget, |
||||||
|
Text(notificationCount.toString()), |
||||||
|
], |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return NavigationDrawerDestination( |
||||||
|
label: labelWidget, |
||||||
|
icon: icon, |
||||||
|
selectedIcon: selectedIcon, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
Tab toTab() { |
||||||
|
return Tab( |
||||||
|
icon: icon, |
||||||
|
text: label, |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
|
||||||
|
class NeonNavBarLayout extends SlotLayout { |
||||||
|
NeonNavBarLayout({ |
||||||
|
required List<NeonNavigationDestination> destinations, |
||||||
|
required ValueNotifier<int> valueListenable, |
||||||
|
super.key, |
||||||
|
}) : super( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.small: SlotLayout.from( |
||||||
|
key: const Key('bottomNavigation'), |
||||||
|
outAnimation: AdaptiveScaffold.topToBottom, |
||||||
|
builder: (_) { |
||||||
|
return ValueListenableBuilder( |
||||||
|
valueListenable: valueListenable, |
||||||
|
builder: (context, value, child) => NavigationBar( |
||||||
|
selectedIndex: value, |
||||||
|
destinations: |
||||||
|
destinations.map((d) => d.toDestination()).toList(), |
||||||
|
onDestinationSelected: (index) => |
||||||
|
valueListenable.value = index, |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
}, |
||||||
|
); |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/data.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
|
||||||
|
class NeonNavRailLayout extends SlotLayout { |
||||||
|
NeonNavRailLayout({ |
||||||
|
required List<NeonNavigationDestination> destinations, |
||||||
|
required ValueNotifier<int> valueListenable, |
||||||
|
FloatingActionButton? floatingActionButton, |
||||||
|
super.key, |
||||||
|
}) : super( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.medium: SlotLayout.from( |
||||||
|
key: const Key('primaryNavigation'), |
||||||
|
outAnimation: AdaptiveScaffold.leftInOut, |
||||||
|
builder: (_) { |
||||||
|
final fab = floatingActionButton != null |
||||||
|
? FloatingActionButton( |
||||||
|
onPressed: floatingActionButton.onPressed, |
||||||
|
tooltip: floatingActionButton.tooltip, |
||||||
|
elevation: 0, |
||||||
|
child: floatingActionButton.child, |
||||||
|
) |
||||||
|
: const SizedBox(height: 56); |
||||||
|
|
||||||
|
return ValueListenableBuilder( |
||||||
|
valueListenable: valueListenable, |
||||||
|
builder: (context, value, child) => SizedBox( |
||||||
|
width: 80, |
||||||
|
child: NavigationRail( |
||||||
|
leading: Column( |
||||||
|
children: [ |
||||||
|
const SizedBox(height: 56), |
||||||
|
const DrawerButton(), |
||||||
|
const SizedBox(height: 16), |
||||||
|
fab, |
||||||
|
const SizedBox(height: 80), |
||||||
|
], |
||||||
|
), |
||||||
|
destinations: destinations.map((d) => d.toRailDestination()).toList(), |
||||||
|
selectedIndex: value, |
||||||
|
onDestinationSelected: (index) => valueListenable.value = index, |
||||||
|
labelType: NavigationRailLabelType.all, |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
Breakpoints.large: SlotLayout.from( |
||||||
|
key: const Key('Large primaryNavigation'), |
||||||
|
builder: (context) { |
||||||
|
// this is ugly. We should abstract this in another way |
||||||
|
final fab = floatingActionButton != null |
||||||
|
? FloatingActionButton.extended( |
||||||
|
onPressed: floatingActionButton.onPressed, |
||||||
|
label: Text(floatingActionButton.tooltip!), |
||||||
|
icon: floatingActionButton.child, |
||||||
|
elevation: 0, |
||||||
|
) |
||||||
|
: null; |
||||||
|
|
||||||
|
return ValueListenableBuilder( |
||||||
|
valueListenable: valueListenable, |
||||||
|
builder: (context, value, child) => NavigationDrawer( |
||||||
|
selectedIndex: value, |
||||||
|
onDestinationSelected: (index) => valueListenable.value = index, |
||||||
|
children: <Widget>[ |
||||||
|
const NeonDrawerHeader(name: 'coolApp'), |
||||||
|
if (fab != null) ...[ |
||||||
|
Padding( |
||||||
|
padding: const EdgeInsets.symmetric( |
||||||
|
horizontal: 28, |
||||||
|
vertical: 16, |
||||||
|
), |
||||||
|
child: fab, |
||||||
|
), |
||||||
|
], |
||||||
|
...destinations.map((d) => d.toDrawerDestination()), |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
}, |
||||||
|
); |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
|
||||||
|
class NeonTabBar extends InheritedWidget { |
||||||
|
const NeonTabBar({ |
||||||
|
required this.tabBarLayout, |
||||||
|
required super.child, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final SlotLayout tabBarLayout; |
||||||
|
|
||||||
|
static NeonTabBar? maybeOf(BuildContext context) { |
||||||
|
return context.dependOnInheritedWidgetOfExactType<NeonTabBar>(); |
||||||
|
} |
||||||
|
|
||||||
|
static NeonTabBar of(BuildContext context) { |
||||||
|
final result = maybeOf(context); |
||||||
|
assert(result != null, 'No NeonTabBar found in context'); |
||||||
|
return result!; |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
bool updateShouldNotify(NeonTabBar oldWidget) => |
||||||
|
tabBarLayout != oldWidget.tabBarLayout; |
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/app_route.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
part 'files.g.dart'; |
||||||
|
part 'routes.dart'; |
||||||
|
|
||||||
|
final view = ListView.builder( |
||||||
|
itemBuilder: (context, index) { |
||||||
|
return Card( |
||||||
|
child: ListTile( |
||||||
|
leading: const Icon(Icons.folder_outlined), |
||||||
|
title: const Text('item'), |
||||||
|
trailing: Text(index.toString()), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
final fab = FloatingActionButton( |
||||||
|
onPressed: () {}, |
||||||
|
child: const Icon(Icons.add), |
||||||
|
); |
||||||
|
|
||||||
|
class FilesAppView extends StatelessWidget { |
||||||
|
const FilesAppView({ |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final topNavigation = NeonTabBar.of(context).tabBarLayout; |
||||||
|
|
||||||
|
return AdaptiveLayout( |
||||||
|
internalAnimations: false, |
||||||
|
topNavigation: topNavigation, |
||||||
|
body: SlotLayout( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.standard: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (context) { |
||||||
|
final drawerButton = DrawerButton( |
||||||
|
onPressed: Scaffold.of(context).openDrawer, |
||||||
|
); |
||||||
|
|
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
leading: drawerButton, |
||||||
|
title: const Text('Files'), |
||||||
|
), |
||||||
|
body: view, |
||||||
|
floatingActionButton: fab, |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
Breakpoints.large: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (_) => Scaffold( |
||||||
|
body: view, |
||||||
|
floatingActionButton: fab, |
||||||
|
), |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final filesApp = App( |
||||||
|
route: $filesAppRoute, |
||||||
|
destination: const NeonNavigationDestination( |
||||||
|
icon: Icon(Icons.folder_outlined), |
||||||
|
selectedIcon: Icon(Icons.folder), |
||||||
|
label: 'Files', |
||||||
|
), |
||||||
|
); |
@ -0,0 +1,32 @@ |
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND |
||||||
|
|
||||||
|
part of 'files.dart'; |
||||||
|
|
||||||
|
// ************************************************************************** |
||||||
|
// GoRouterGenerator |
||||||
|
// ************************************************************************** |
||||||
|
|
||||||
|
List<RouteBase> get $appRoutes => [ |
||||||
|
$filesAppRoute, |
||||||
|
]; |
||||||
|
|
||||||
|
RouteBase get $filesAppRoute => GoRouteData.$route( |
||||||
|
path: '/apps/files', |
||||||
|
name: 'filesApp', |
||||||
|
factory: $FilesAppRouteExtension._fromState, |
||||||
|
); |
||||||
|
|
||||||
|
extension $FilesAppRouteExtension on FilesAppRoute { |
||||||
|
static FilesAppRoute _fromState(GoRouterState state) => const FilesAppRoute(); |
||||||
|
|
||||||
|
String get location => GoRouteData.$location( |
||||||
|
'/apps/files', |
||||||
|
); |
||||||
|
|
||||||
|
void go(BuildContext context) => context.go(location); |
||||||
|
|
||||||
|
Future<T?> push<T>(BuildContext context) => context.push<T>(location); |
||||||
|
|
||||||
|
void pushReplacement(BuildContext context) => |
||||||
|
context.pushReplacement(location); |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
part of 'files.dart'; |
||||||
|
|
||||||
|
@TypedGoRoute<FilesAppRoute>( |
||||||
|
path: '/apps/files', |
||||||
|
name: 'filesApp', |
||||||
|
) |
||||||
|
@immutable |
||||||
|
class FilesAppRoute extends NeonAppRoute { |
||||||
|
const FilesAppRoute(); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context, GoRouterState state) { |
||||||
|
return const FilesAppView(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,135 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/account_switcher.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/data.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; |
||||||
|
import 'package:adaptive_layout/src/files/files.dart'; |
||||||
|
import 'package:adaptive_layout/src/news/news.dart'; |
||||||
|
import 'package:adaptive_layout/src/notes/notes.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
final apps = [ |
||||||
|
filesApp, |
||||||
|
notesApp, |
||||||
|
newsApp, |
||||||
|
]; |
||||||
|
|
||||||
|
class NeonMainView extends StatefulWidget { |
||||||
|
const NeonMainView({ |
||||||
|
required this.state, |
||||||
|
required this.view, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final GoRouterState state; |
||||||
|
final Widget view; |
||||||
|
|
||||||
|
@override |
||||||
|
State<NeonMainView> createState() => _NeonMainViewState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _NeonMainViewState extends State<NeonMainView> with SingleTickerProviderStateMixin { |
||||||
|
final _scaffoldKey = GlobalKey<ScaffoldState>(); |
||||||
|
late TabController _tabController; |
||||||
|
|
||||||
|
int _activeApp = 0; |
||||||
|
|
||||||
|
@override |
||||||
|
void initState() { |
||||||
|
super.initState(); |
||||||
|
|
||||||
|
_tabController = TabController( |
||||||
|
vsync: this, |
||||||
|
length: apps.length, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
void dispose() { |
||||||
|
_tabController.dispose(); |
||||||
|
super.dispose(); |
||||||
|
} |
||||||
|
|
||||||
|
void onAppChange(int index) { |
||||||
|
context.goNamed(apps[index].routeName); |
||||||
|
|
||||||
|
setState(() { |
||||||
|
_activeApp = index; |
||||||
|
}); |
||||||
|
|
||||||
|
_scaffoldKey.currentState?.closeDrawer(); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final theme = Theme.of(context); |
||||||
|
final colorScheme = theme.colorScheme; |
||||||
|
|
||||||
|
final header = DrawerHeader( |
||||||
|
decoration: BoxDecoration( |
||||||
|
color: colorScheme.primary, |
||||||
|
), |
||||||
|
child: Column( |
||||||
|
children: [ |
||||||
|
Expanded( |
||||||
|
child: Center( |
||||||
|
child: Icon( |
||||||
|
Icons.cloud_outlined, // that's the new NC icon for sure |
||||||
|
size: 100, |
||||||
|
color: colorScheme.onPrimary, |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
const NeonAccountSwitcher(), |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
final drawer = NavigationDrawer( |
||||||
|
selectedIndex: _activeApp, |
||||||
|
onDestinationSelected: onAppChange, |
||||||
|
children: [ |
||||||
|
header, |
||||||
|
...apps.map((app) => app.destination.toDrawerDestination()), |
||||||
|
const NeonSettingsDrawerItem(), |
||||||
|
], |
||||||
|
); |
||||||
|
|
||||||
|
final topNavigation = SlotLayout( |
||||||
|
config: { |
||||||
|
Breakpoints.large: SlotLayout.from( |
||||||
|
key: const Key('Large topNavigation'), |
||||||
|
builder: (context) { |
||||||
|
return Row( |
||||||
|
children: [ |
||||||
|
Expanded( |
||||||
|
child: TabBar( |
||||||
|
tabs: apps.map((a) => a.destination.toTab()).toList(), |
||||||
|
onTap: onAppChange, |
||||||
|
isScrollable: true, |
||||||
|
), |
||||||
|
), |
||||||
|
IconButton( |
||||||
|
onPressed: () {}, |
||||||
|
icon: const Icon(Icons.person_outline), |
||||||
|
), |
||||||
|
], |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
return Scaffold( |
||||||
|
key: _scaffoldKey, |
||||||
|
drawer: drawer, |
||||||
|
body: DefaultTabController( |
||||||
|
length: apps.length, |
||||||
|
child: NeonTabBar( |
||||||
|
tabBarLayout: topNavigation, |
||||||
|
child: widget.view, |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,141 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/app_route.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
part 'news.g.dart'; |
||||||
|
part 'routes.dart'; |
||||||
|
|
||||||
|
class NewsAppView extends StatelessWidget { |
||||||
|
const NewsAppView({ |
||||||
|
this.articleID, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final int? articleID; |
||||||
|
|
||||||
|
Widget secondaryBodyNuilder(BuildContext context) { |
||||||
|
return NewsSecondaryView(id: articleID!); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final topNavigation = NeonTabBar.of(context).tabBarLayout; |
||||||
|
|
||||||
|
final listView = ListView.builder( |
||||||
|
itemBuilder: (context, index) { |
||||||
|
return Card( |
||||||
|
child: ListTile( |
||||||
|
leading: const Icon(Icons.article_outlined), |
||||||
|
title: const Text('item'), |
||||||
|
trailing: Text(index.toString()), |
||||||
|
onTap: () => NewsAppRoute(index).go(context), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
return AdaptiveLayout( |
||||||
|
internalAnimations: false, |
||||||
|
topNavigation: topNavigation, |
||||||
|
body: SlotLayout( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.standard: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (context) { |
||||||
|
final drawerButton = DrawerButton( |
||||||
|
onPressed: Scaffold.of(context).openDrawer, |
||||||
|
); |
||||||
|
|
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
leading: drawerButton, |
||||||
|
title: const Text('News'), |
||||||
|
), |
||||||
|
body: listView, |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
if (articleID != null) ...{ |
||||||
|
Breakpoints.small: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (context) { |
||||||
|
return NewsSecondaryView( |
||||||
|
id: articleID!, |
||||||
|
isPage: true, |
||||||
|
); |
||||||
|
}, |
||||||
|
) |
||||||
|
}, |
||||||
|
Breakpoints.large: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (_) => Scaffold( |
||||||
|
body: listView, |
||||||
|
), |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
secondaryBody: SlotLayout( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.mediumAndUp: SlotLayout.from( |
||||||
|
key: const Key('secondaryBody'), |
||||||
|
builder: articleID != null |
||||||
|
? secondaryBodyNuilder |
||||||
|
: AdaptiveScaffold.emptyBuilder, |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class NewsSecondaryView extends StatelessWidget { |
||||||
|
const NewsSecondaryView({ |
||||||
|
required this.id, |
||||||
|
this.isPage = false, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final int id; |
||||||
|
final bool isPage; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final appBar = AppBar( |
||||||
|
leading: BackButton( |
||||||
|
onPressed: () => const NewsAppRoute().go(context), |
||||||
|
), |
||||||
|
title: const Text('NewsItem'), |
||||||
|
); |
||||||
|
|
||||||
|
return Scaffold( |
||||||
|
appBar: isPage ? appBar : null, |
||||||
|
body: Center( |
||||||
|
child: Column( |
||||||
|
mainAxisAlignment: MainAxisAlignment.center, |
||||||
|
children: [ |
||||||
|
const FlutterLogo(size: 100), |
||||||
|
const SizedBox(height: 30), |
||||||
|
Text( |
||||||
|
id.toString(), |
||||||
|
style: Theme.of(context).textTheme.headlineLarge, |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final newsApp = App( |
||||||
|
route: $newsAppRoute, |
||||||
|
destination: const NeonNavigationDestination( |
||||||
|
icon: Icon(Icons.notes_outlined), |
||||||
|
selectedIcon: Icon(Icons.notes), |
||||||
|
label: 'News', |
||||||
|
notificationCount: 100, |
||||||
|
), |
||||||
|
); |
@ -0,0 +1,46 @@ |
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND |
||||||
|
|
||||||
|
part of 'news.dart'; |
||||||
|
|
||||||
|
// ************************************************************************** |
||||||
|
// GoRouterGenerator |
||||||
|
// ************************************************************************** |
||||||
|
|
||||||
|
List<RouteBase> get $appRoutes => [ |
||||||
|
$newsAppRoute, |
||||||
|
]; |
||||||
|
|
||||||
|
RouteBase get $newsAppRoute => GoRouteData.$route( |
||||||
|
path: '/apps/news', |
||||||
|
name: 'newsApp', |
||||||
|
factory: $NewsAppRouteExtension._fromState, |
||||||
|
); |
||||||
|
|
||||||
|
extension $NewsAppRouteExtension on NewsAppRoute { |
||||||
|
static NewsAppRoute _fromState(GoRouterState state) => NewsAppRoute( |
||||||
|
_$convertMapValue('article-i-d', state.queryParameters, int.parse), |
||||||
|
); |
||||||
|
|
||||||
|
String get location => GoRouteData.$location( |
||||||
|
'/apps/news', |
||||||
|
queryParams: { |
||||||
|
if (articleID != null) 'article-i-d': articleID!.toString(), |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
void go(BuildContext context) => context.go(location); |
||||||
|
|
||||||
|
Future<T?> push<T>(BuildContext context) => context.push<T>(location); |
||||||
|
|
||||||
|
void pushReplacement(BuildContext context) => |
||||||
|
context.pushReplacement(location); |
||||||
|
} |
||||||
|
|
||||||
|
T? _$convertMapValue<T>( |
||||||
|
String key, |
||||||
|
Map<String, String> map, |
||||||
|
T Function(String) converter, |
||||||
|
) { |
||||||
|
final value = map[key]; |
||||||
|
return value == null ? null : converter(value); |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
part of 'news.dart'; |
||||||
|
|
||||||
|
@TypedGoRoute<NewsAppRoute>( |
||||||
|
path: '/apps/news', |
||||||
|
name: 'newsApp', |
||||||
|
) |
||||||
|
@immutable |
||||||
|
class NewsAppRoute extends NeonAppRoute { |
||||||
|
const NewsAppRoute([this.articleID]); |
||||||
|
|
||||||
|
final int? articleID; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context, GoRouterState state) { |
||||||
|
return NewsAppView(articleID: articleID); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,149 @@ |
|||||||
|
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/app_route.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/destination.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/navbar_layout.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/navrail_layout.dart'; |
||||||
|
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
part 'notes.g.dart'; |
||||||
|
part 'routes.dart'; |
||||||
|
|
||||||
|
final _destinations = <NeonNavigationDestination>[ |
||||||
|
const NeonNavigationDestination( |
||||||
|
icon: Icon(Icons.note_outlined), |
||||||
|
selectedIcon: Icon(Icons.note), |
||||||
|
label: 'Notes', |
||||||
|
), |
||||||
|
const NeonNavigationDestination( |
||||||
|
icon: Icon(Icons.label_outline), |
||||||
|
selectedIcon: Icon(Icons.label), |
||||||
|
label: 'Category', |
||||||
|
), |
||||||
|
]; |
||||||
|
|
||||||
|
final _appNavNotifier = ValueNotifier<int>(0); |
||||||
|
|
||||||
|
final _listView = ListView.builder( |
||||||
|
itemBuilder: (context, index) { |
||||||
|
return Card( |
||||||
|
child: ListTile( |
||||||
|
leading: const Icon(Icons.article_outlined), |
||||||
|
title: const Text('item'), |
||||||
|
trailing: Text(index.toString()), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
final _gridView = GridView.builder( |
||||||
|
itemBuilder: (context, index) { |
||||||
|
return Card( |
||||||
|
child: ListTile( |
||||||
|
leading: const Icon(Icons.article_outlined), |
||||||
|
title: const Text('item'), |
||||||
|
trailing: Text(index.toString()), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 150), |
||||||
|
); |
||||||
|
|
||||||
|
final view = ValueListenableBuilder( |
||||||
|
valueListenable: _appNavNotifier, |
||||||
|
builder: (context, value, child) { |
||||||
|
if (value == 1) { |
||||||
|
return _gridView; |
||||||
|
} |
||||||
|
|
||||||
|
return _listView; |
||||||
|
}, |
||||||
|
); |
||||||
|
|
||||||
|
final fab = FloatingActionButton( |
||||||
|
onPressed: () {}, |
||||||
|
tooltip: 'Create Note', |
||||||
|
child: const Icon(Icons.add), |
||||||
|
); |
||||||
|
|
||||||
|
class NotesAppView extends StatelessWidget { |
||||||
|
const NotesAppView({ |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
final topNavigation = NeonTabBar.of(context).tabBarLayout; |
||||||
|
|
||||||
|
return AdaptiveLayout( |
||||||
|
internalAnimations: false, |
||||||
|
topNavigation: topNavigation, |
||||||
|
body: SlotLayout( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.standard: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (_) => Scaffold( |
||||||
|
body: view, |
||||||
|
), |
||||||
|
), |
||||||
|
Breakpoints.small: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (context) { |
||||||
|
final drawerButton = DrawerButton( |
||||||
|
onPressed: Scaffold.of(context).openDrawer, |
||||||
|
); |
||||||
|
|
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
leading: drawerButton, |
||||||
|
title: const Text('Notes'), |
||||||
|
), |
||||||
|
body: view, |
||||||
|
floatingActionButton: fab, |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
secondaryBody: SlotLayout( |
||||||
|
config: <Breakpoint, SlotLayoutConfig?>{ |
||||||
|
Breakpoints.mediumAndUp: SlotLayout.from( |
||||||
|
key: const Key('body'), |
||||||
|
builder: (_) => Scaffold( |
||||||
|
body: ListView.builder( |
||||||
|
itemBuilder: (context, index) { |
||||||
|
return Card( |
||||||
|
child: ListTile( |
||||||
|
title: const Text('item'), |
||||||
|
trailing: Text(index.toString()), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
primaryNavigation: NeonNavRailLayout( |
||||||
|
destinations: _destinations, |
||||||
|
valueListenable: _appNavNotifier, |
||||||
|
floatingActionButton: fab, |
||||||
|
), |
||||||
|
bottomNavigation: NeonNavBarLayout( |
||||||
|
destinations: _destinations, |
||||||
|
valueListenable: _appNavNotifier, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
final notesApp = App( |
||||||
|
route: $notesAppRoute, |
||||||
|
destination: const NeonNavigationDestination( |
||||||
|
icon: Icon(Icons.edit_outlined), |
||||||
|
selectedIcon: Icon(Icons.edit), |
||||||
|
label: 'Notes', |
||||||
|
), |
||||||
|
); |
@ -0,0 +1,32 @@ |
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND |
||||||
|
|
||||||
|
part of 'notes.dart'; |
||||||
|
|
||||||
|
// ************************************************************************** |
||||||
|
// GoRouterGenerator |
||||||
|
// ************************************************************************** |
||||||
|
|
||||||
|
List<RouteBase> get $appRoutes => [ |
||||||
|
$notesAppRoute, |
||||||
|
]; |
||||||
|
|
||||||
|
RouteBase get $notesAppRoute => GoRouteData.$route( |
||||||
|
path: '/apps/notes', |
||||||
|
name: 'notesApp', |
||||||
|
factory: $NotesAppRouteExtension._fromState, |
||||||
|
); |
||||||
|
|
||||||
|
extension $NotesAppRouteExtension on NotesAppRoute { |
||||||
|
static NotesAppRoute _fromState(GoRouterState state) => const NotesAppRoute(); |
||||||
|
|
||||||
|
String get location => GoRouteData.$location( |
||||||
|
'/apps/notes', |
||||||
|
); |
||||||
|
|
||||||
|
void go(BuildContext context) => context.go(location); |
||||||
|
|
||||||
|
Future<T?> push<T>(BuildContext context) => context.push<T>(location); |
||||||
|
|
||||||
|
void pushReplacement(BuildContext context) => |
||||||
|
context.pushReplacement(location); |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
part of 'notes.dart'; |
||||||
|
|
||||||
|
@TypedGoRoute<NotesAppRoute>( |
||||||
|
path: '/apps/notes', |
||||||
|
name: 'notesApp', |
||||||
|
) |
||||||
|
@immutable |
||||||
|
class NotesAppRoute extends NeonAppRoute { |
||||||
|
const NotesAppRoute(); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context, GoRouterState state) { |
||||||
|
return const NotesAppView(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
import 'package:adaptive_layout/src/files/files.dart'; |
||||||
|
import 'package:adaptive_layout/src/main_view.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:go_router/go_router.dart'; |
||||||
|
|
||||||
|
final GlobalKey<NavigatorState> _rootKey = GlobalKey<NavigatorState>(); |
||||||
|
final GlobalKey<NavigatorState> _appsKey = GlobalKey<NavigatorState>(); |
||||||
|
|
||||||
|
final router = GoRouter( |
||||||
|
navigatorKey: _rootKey, |
||||||
|
initialLocation: const FilesAppRoute().location, |
||||||
|
routes: [ |
||||||
|
ShellRoute( |
||||||
|
navigatorKey: _appsKey, |
||||||
|
builder: (context, state, navigator) { |
||||||
|
return NeonMainView( |
||||||
|
state: state, |
||||||
|
view: navigator, |
||||||
|
); |
||||||
|
}, |
||||||
|
routes: [ |
||||||
|
...apps.map((a) => a.route), |
||||||
|
], |
||||||
|
), |
||||||
|
], |
||||||
|
); |
@ -0,0 +1 @@ |
|||||||
|
flutter/ephemeral |
@ -0,0 +1,139 @@ |
|||||||
|
# Project-level configuration. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
project(runner LANGUAGES CXX) |
||||||
|
|
||||||
|
# The name of the executable created for the application. Change this to change |
||||||
|
# the on-disk name of your application. |
||||||
|
set(BINARY_NAME "adaptive_layout") |
||||||
|
# The unique GTK application identifier for this application. See: |
||||||
|
# https://wiki.gnome.org/HowDoI/ChooseApplicationID |
||||||
|
set(APPLICATION_ID "com.example.adaptive_layout") |
||||||
|
|
||||||
|
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent |
||||||
|
# versions of CMake. |
||||||
|
cmake_policy(SET CMP0063 NEW) |
||||||
|
|
||||||
|
# Load bundled libraries from the lib/ directory relative to the binary. |
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") |
||||||
|
|
||||||
|
# Root filesystem for cross-building. |
||||||
|
if(FLUTTER_TARGET_PLATFORM_SYSROOT) |
||||||
|
set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Define build configuration options. |
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||||
|
set(CMAKE_BUILD_TYPE "Debug" CACHE |
||||||
|
STRING "Flutter build mode" FORCE) |
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS |
||||||
|
"Debug" "Profile" "Release") |
||||||
|
endif() |
||||||
|
|
||||||
|
# Compilation settings that should be applied to most targets. |
||||||
|
# |
||||||
|
# Be cautious about adding new options here, as plugins use this function by |
||||||
|
# default. In most cases, you should add new options to specific targets instead |
||||||
|
# of modifying this function. |
||||||
|
function(APPLY_STANDARD_SETTINGS TARGET) |
||||||
|
target_compile_features(${TARGET} PUBLIC cxx_std_14) |
||||||
|
target_compile_options(${TARGET} PRIVATE -Wall -Werror) |
||||||
|
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") |
||||||
|
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# Flutter library and tool build rules. |
||||||
|
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") |
||||||
|
add_subdirectory(${FLUTTER_MANAGED_DIR}) |
||||||
|
|
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
|
||||||
|
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") |
||||||
|
|
||||||
|
# Define the application target. To change its name, change BINARY_NAME above, |
||||||
|
# not the value here, or `flutter run` will no longer work. |
||||||
|
# |
||||||
|
# Any new source files that you add to the application should be added here. |
||||||
|
add_executable(${BINARY_NAME} |
||||||
|
"main.cc" |
||||||
|
"my_application.cc" |
||||||
|
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" |
||||||
|
) |
||||||
|
|
||||||
|
# Apply the standard set of build settings. This can be removed for applications |
||||||
|
# that need different build settings. |
||||||
|
apply_standard_settings(${BINARY_NAME}) |
||||||
|
|
||||||
|
# Add dependency libraries. Add any application-specific dependencies here. |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE flutter) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) |
||||||
|
|
||||||
|
# Run the Flutter tool portions of the build. This must not be removed. |
||||||
|
add_dependencies(${BINARY_NAME} flutter_assemble) |
||||||
|
|
||||||
|
# Only the install-generated bundle's copy of the executable will launch |
||||||
|
# correctly, since the resources must in the right relative locations. To avoid |
||||||
|
# people trying to run the unbundled copy, put it in a subdirectory instead of |
||||||
|
# the default top-level location. |
||||||
|
set_target_properties(${BINARY_NAME} |
||||||
|
PROPERTIES |
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
# Generated plugin build rules, which manage building the plugins and adding |
||||||
|
# them to the application. |
||||||
|
include(flutter/generated_plugins.cmake) |
||||||
|
|
||||||
|
|
||||||
|
# === Installation === |
||||||
|
# By default, "installing" just makes a relocatable bundle in the build |
||||||
|
# directory. |
||||||
|
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") |
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
||||||
|
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Start with a clean build bundle directory every time. |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
|
||||||
|
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") |
||||||
|
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") |
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) |
||||||
|
install(FILES "${bundled_library}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endforeach(bundled_library) |
||||||
|
|
||||||
|
# Fully re-copy the assets directory on each build to avoid having stale files |
||||||
|
# from a previous install. |
||||||
|
set(FLUTTER_ASSET_DIR_NAME "flutter_assets") |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) |
||||||
|
|
||||||
|
# Install the AOT library on non-Debug builds only. |
||||||
|
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") |
||||||
|
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endif() |
@ -0,0 +1,88 @@ |
|||||||
|
# This file controls Flutter-level build steps. It should not be edited. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
|
||||||
|
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") |
||||||
|
|
||||||
|
# Configuration provided via flutter tool. |
||||||
|
include(${EPHEMERAL_DIR}/generated_config.cmake) |
||||||
|
|
||||||
|
# TODO: Move the rest of this into files in ephemeral. See |
||||||
|
# https://github.com/flutter/flutter/issues/57146. |
||||||
|
|
||||||
|
# Serves the same purpose as list(TRANSFORM ... PREPEND ...), |
||||||
|
# which isn't available in 3.10. |
||||||
|
function(list_prepend LIST_NAME PREFIX) |
||||||
|
set(NEW_LIST "") |
||||||
|
foreach(element ${${LIST_NAME}}) |
||||||
|
list(APPEND NEW_LIST "${PREFIX}${element}") |
||||||
|
endforeach(element) |
||||||
|
set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# === Flutter Library === |
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) |
||||||
|
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) |
||||||
|
|
||||||
|
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") |
||||||
|
|
||||||
|
# Published to parent scope for install step. |
||||||
|
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) |
||||||
|
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) |
||||||
|
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) |
||||||
|
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) |
||||||
|
|
||||||
|
list(APPEND FLUTTER_LIBRARY_HEADERS |
||||||
|
"fl_basic_message_channel.h" |
||||||
|
"fl_binary_codec.h" |
||||||
|
"fl_binary_messenger.h" |
||||||
|
"fl_dart_project.h" |
||||||
|
"fl_engine.h" |
||||||
|
"fl_json_message_codec.h" |
||||||
|
"fl_json_method_codec.h" |
||||||
|
"fl_message_codec.h" |
||||||
|
"fl_method_call.h" |
||||||
|
"fl_method_channel.h" |
||||||
|
"fl_method_codec.h" |
||||||
|
"fl_method_response.h" |
||||||
|
"fl_plugin_registrar.h" |
||||||
|
"fl_plugin_registry.h" |
||||||
|
"fl_standard_message_codec.h" |
||||||
|
"fl_standard_method_codec.h" |
||||||
|
"fl_string_codec.h" |
||||||
|
"fl_value.h" |
||||||
|
"fl_view.h" |
||||||
|
"flutter_linux.h" |
||||||
|
) |
||||||
|
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") |
||||||
|
add_library(flutter INTERFACE) |
||||||
|
target_include_directories(flutter INTERFACE |
||||||
|
"${EPHEMERAL_DIR}" |
||||||
|
) |
||||||
|
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") |
||||||
|
target_link_libraries(flutter INTERFACE |
||||||
|
PkgConfig::GTK |
||||||
|
PkgConfig::GLIB |
||||||
|
PkgConfig::GIO |
||||||
|
) |
||||||
|
add_dependencies(flutter flutter_assemble) |
||||||
|
|
||||||
|
# === Flutter tool backend === |
||||||
|
# _phony_ is a non-existent file to force this command to run every time, |
||||||
|
# since currently there's no way to get a full input/output list from the |
||||||
|
# flutter tool. |
||||||
|
add_custom_command( |
||||||
|
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
||||||
|
COMMAND ${CMAKE_COMMAND} -E env |
||||||
|
${FLUTTER_TOOL_ENVIRONMENT} |
||||||
|
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
||||||
|
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
||||||
|
VERBATIM |
||||||
|
) |
||||||
|
add_custom_target(flutter_assemble DEPENDS |
||||||
|
"${FLUTTER_LIBRARY}" |
||||||
|
${FLUTTER_LIBRARY_HEADERS} |
||||||
|
) |
@ -0,0 +1,11 @@ |
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#include "generated_plugin_registrant.h" |
||||||
|
|
||||||
|
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry) { |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#ifndef GENERATED_PLUGIN_REGISTRANT_ |
||||||
|
#define GENERATED_PLUGIN_REGISTRANT_ |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
|
||||||
|
// Registers Flutter plugins.
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry); |
||||||
|
|
||||||
|
#endif // GENERATED_PLUGIN_REGISTRANT_
|
@ -0,0 +1,23 @@ |
|||||||
|
# |
||||||
|
# Generated file, do not edit. |
||||||
|
# |
||||||
|
|
||||||
|
list(APPEND FLUTTER_PLUGIN_LIST |
||||||
|
) |
||||||
|
|
||||||
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST |
||||||
|
) |
||||||
|
|
||||||
|
set(PLUGIN_BUNDLED_LIBRARIES) |
||||||
|
|
||||||
|
foreach(plugin ${FLUTTER_PLUGIN_LIST}) |
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) |
||||||
|
endforeach(plugin) |
||||||
|
|
||||||
|
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) |
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) |
||||||
|
endforeach(ffi_plugin) |
@ -0,0 +1,6 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
g_autoptr(MyApplication) app = my_application_new(); |
||||||
|
return g_application_run(G_APPLICATION(app), argc, argv); |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
#include <gdk/gdkx.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "flutter/generated_plugin_registrant.h" |
||||||
|
|
||||||
|
struct _MyApplication { |
||||||
|
GtkApplication parent_instance; |
||||||
|
char** dart_entrypoint_arguments; |
||||||
|
}; |
||||||
|
|
||||||
|
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) |
||||||
|
|
||||||
|
// Implements GApplication::activate.
|
||||||
|
static void my_application_activate(GApplication* application) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
GtkWindow* window = |
||||||
|
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); |
||||||
|
|
||||||
|
// Use a header bar when running in GNOME as this is the common style used
|
||||||
|
// by applications and is the setup most users will be using (e.g. Ubuntu
|
||||||
|
// desktop).
|
||||||
|
// If running on X and not using GNOME then just use a traditional title bar
|
||||||
|
// in case the window manager does more exotic layout, e.g. tiling.
|
||||||
|
// If running on Wayland assume the header bar will work (may need changing
|
||||||
|
// if future cases occur).
|
||||||
|
gboolean use_header_bar = TRUE; |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
GdkScreen* screen = gtk_window_get_screen(window); |
||||||
|
if (GDK_IS_X11_SCREEN(screen)) { |
||||||
|
const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); |
||||||
|
if (g_strcmp0(wm_name, "GNOME Shell") != 0) { |
||||||
|
use_header_bar = FALSE; |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
if (use_header_bar) { |
||||||
|
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); |
||||||
|
gtk_widget_show(GTK_WIDGET(header_bar)); |
||||||
|
gtk_header_bar_set_title(header_bar, "adaptive_layout"); |
||||||
|
gtk_header_bar_set_show_close_button(header_bar, TRUE); |
||||||
|
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); |
||||||
|
} else { |
||||||
|
gtk_window_set_title(window, "adaptive_layout"); |
||||||
|
} |
||||||
|
|
||||||
|
gtk_window_set_default_size(window, 1280, 720); |
||||||
|
gtk_widget_show(GTK_WIDGET(window)); |
||||||
|
|
||||||
|
g_autoptr(FlDartProject) project = fl_dart_project_new(); |
||||||
|
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); |
||||||
|
|
||||||
|
FlView* view = fl_view_new(project); |
||||||
|
gtk_widget_show(GTK_WIDGET(view)); |
||||||
|
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); |
||||||
|
|
||||||
|
fl_register_plugins(FL_PLUGIN_REGISTRY(view)); |
||||||
|
|
||||||
|
gtk_widget_grab_focus(GTK_WIDGET(view)); |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GApplication::local_command_line.
|
||||||
|
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
// Strip out the first argument as it is the binary name.
|
||||||
|
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); |
||||||
|
|
||||||
|
g_autoptr(GError) error = nullptr; |
||||||
|
if (!g_application_register(application, nullptr, &error)) { |
||||||
|
g_warning("Failed to register: %s", error->message); |
||||||
|
*exit_status = 1; |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
g_application_activate(application); |
||||||
|
*exit_status = 0; |
||||||
|
|
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GObject::dispose.
|
||||||
|
static void my_application_dispose(GObject* object) { |
||||||
|
MyApplication* self = MY_APPLICATION(object); |
||||||
|
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); |
||||||
|
G_OBJECT_CLASS(my_application_parent_class)->dispose(object); |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_class_init(MyApplicationClass* klass) { |
||||||
|
G_APPLICATION_CLASS(klass)->activate = my_application_activate; |
||||||
|
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; |
||||||
|
G_OBJECT_CLASS(klass)->dispose = my_application_dispose; |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_init(MyApplication* self) {} |
||||||
|
|
||||||
|
MyApplication* my_application_new() { |
||||||
|
return MY_APPLICATION(g_object_new(my_application_get_type(), |
||||||
|
"application-id", APPLICATION_ID, |
||||||
|
"flags", G_APPLICATION_NON_UNIQUE, |
||||||
|
nullptr)); |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
#ifndef FLUTTER_MY_APPLICATION_H_ |
||||||
|
#define FLUTTER_MY_APPLICATION_H_ |
||||||
|
|
||||||
|
#include <gtk/gtk.h> |
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, |
||||||
|
GtkApplication) |
||||||
|
|
||||||
|
/**
|
||||||
|
* my_application_new: |
||||||
|
* |
||||||
|
* Creates a new Flutter-based application. |
||||||
|
* |
||||||
|
* Returns: a new #MyApplication. |
||||||
|
*/ |
||||||
|
MyApplication* my_application_new(); |
||||||
|
|
||||||
|
#endif // FLUTTER_MY_APPLICATION_H_
|
@ -0,0 +1,555 @@ |
|||||||
|
# Generated by pub |
||||||
|
# See https://dart.dev/tools/pub/glossary#lockfile |
||||||
|
packages: |
||||||
|
_fe_analyzer_shared: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: _fe_analyzer_shared |
||||||
|
sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "61.0.0" |
||||||
|
analyzer: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: analyzer |
||||||
|
sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "5.13.0" |
||||||
|
args: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: args |
||||||
|
sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.4.1" |
||||||
|
async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: async |
||||||
|
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.11.0" |
||||||
|
boolean_selector: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: boolean_selector |
||||||
|
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
build: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: build |
||||||
|
sha256: "43865b79fbb78532e4bff7c33087aa43b1d488c4fdef014eaef568af6d8016dc" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.4.0" |
||||||
|
build_config: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: build_config |
||||||
|
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.1" |
||||||
|
build_daemon: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: build_daemon |
||||||
|
sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "4.0.0" |
||||||
|
build_resolvers: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: build_resolvers |
||||||
|
sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.2.0" |
||||||
|
build_runner: |
||||||
|
dependency: "direct dev" |
||||||
|
description: |
||||||
|
name: build_runner |
||||||
|
sha256: "220ae4553e50d7c21a17c051afc7b183d28a24a420502e842f303f8e4e6edced" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.4.4" |
||||||
|
build_runner_core: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: build_runner_core |
||||||
|
sha256: "88a57f2ac99849362e73878334caa9f06ee25f31d2adced882b8337838c84e1e" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "7.2.9" |
||||||
|
built_collection: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: built_collection |
||||||
|
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "5.1.1" |
||||||
|
built_value: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: built_value |
||||||
|
sha256: "7dd62d9faf105c434f3d829bbe9c4be02ec67f5ed94832222116122df67c5452" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "8.6.0" |
||||||
|
characters: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: characters |
||||||
|
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.0" |
||||||
|
checked_yaml: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: checked_yaml |
||||||
|
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.0.3" |
||||||
|
clock: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: clock |
||||||
|
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.1" |
||||||
|
code_builder: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: code_builder |
||||||
|
sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "4.4.0" |
||||||
|
collection: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: collection |
||||||
|
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.17.1" |
||||||
|
convert: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: convert |
||||||
|
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.1.1" |
||||||
|
crypto: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: crypto |
||||||
|
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.0.3" |
||||||
|
cupertino_icons: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: cupertino_icons |
||||||
|
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.5" |
||||||
|
dart_style: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: dart_style |
||||||
|
sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.3.1" |
||||||
|
fake_async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: fake_async |
||||||
|
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.1" |
||||||
|
file: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: file |
||||||
|
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "7.0.0" |
||||||
|
fixnum: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: fixnum |
||||||
|
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.0" |
||||||
|
flutter: |
||||||
|
dependency: "direct main" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_adaptive_scaffold: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: flutter_adaptive_scaffold |
||||||
|
sha256: f9482e41adaf26d6fa9de02b605adc346961cb4bb34fe9420335df591ce3de6d |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.1.3" |
||||||
|
flutter_test: |
||||||
|
dependency: "direct dev" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_web_plugins: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
frontend_server_client: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: frontend_server_client |
||||||
|
sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.2.0" |
||||||
|
glob: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: glob |
||||||
|
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.2" |
||||||
|
go_router: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: go_router |
||||||
|
sha256: "00d1b67d6e9fa443331da229084dd3eb04407f5a2dff22940bd7bba6af5722c3" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "7.1.1" |
||||||
|
go_router_builder: |
||||||
|
dependency: "direct dev" |
||||||
|
description: |
||||||
|
name: go_router_builder |
||||||
|
sha256: "74c6c12cf80248e97d5555df6fcae38a78e9ab7680689e9b9661bd74bcdda74d" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.0.1" |
||||||
|
graphs: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: graphs |
||||||
|
sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.3.1" |
||||||
|
http_multi_server: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: http_multi_server |
||||||
|
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.2.1" |
||||||
|
http_parser: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: http_parser |
||||||
|
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "4.0.2" |
||||||
|
intersperse: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: intersperse |
||||||
|
sha256: "2f8a905c96f6cbba978644a3d5b31b8d86ddc44917662df7d27a61f3df66a576" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.0.0" |
||||||
|
io: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: io |
||||||
|
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.4" |
||||||
|
js: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: js |
||||||
|
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.6.7" |
||||||
|
json_annotation: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: json_annotation |
||||||
|
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "4.8.1" |
||||||
|
logging: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: logging |
||||||
|
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.0" |
||||||
|
matcher: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: matcher |
||||||
|
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.12.15" |
||||||
|
material_color_utilities: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: material_color_utilities |
||||||
|
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.2.0" |
||||||
|
meta: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: meta |
||||||
|
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.9.1" |
||||||
|
mime: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: mime |
||||||
|
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.4" |
||||||
|
nit_picking: |
||||||
|
dependency: "direct dev" |
||||||
|
description: |
||||||
|
path: "." |
||||||
|
ref: "0b2ee0d" |
||||||
|
resolved-ref: "0b2ee0d6d6871a04aaf85e88cd7e877f654d15e3" |
||||||
|
url: "https://github.com/stack11/dart_nit_picking" |
||||||
|
source: git |
||||||
|
version: "0.0.0" |
||||||
|
package_config: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: package_config |
||||||
|
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.0" |
||||||
|
path: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path |
||||||
|
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.8.3" |
||||||
|
path_to_regexp: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_to_regexp |
||||||
|
sha256: "169d78fbd55e61ea8873bcca545979f559d22238f66facdd7ef30870c7f53327" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.4.0" |
||||||
|
pool: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: pool |
||||||
|
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.5.1" |
||||||
|
pub_semver: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: pub_semver |
||||||
|
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.4" |
||||||
|
pubspec_parse: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: pubspec_parse |
||||||
|
sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.3" |
||||||
|
shelf: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: shelf |
||||||
|
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.4.1" |
||||||
|
shelf_web_socket: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: shelf_web_socket |
||||||
|
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.4" |
||||||
|
sky_engine: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.99" |
||||||
|
source_gen: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: source_gen |
||||||
|
sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.2" |
||||||
|
source_helper: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: source_helper |
||||||
|
sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.3" |
||||||
|
source_span: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: source_span |
||||||
|
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.9.1" |
||||||
|
stack_trace: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stack_trace |
||||||
|
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.11.0" |
||||||
|
stream_channel: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stream_channel |
||||||
|
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
stream_transform: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stream_transform |
||||||
|
sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.0" |
||||||
|
string_scanner: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: string_scanner |
||||||
|
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.0" |
||||||
|
term_glyph: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: term_glyph |
||||||
|
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.1" |
||||||
|
test_api: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: test_api |
||||||
|
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.5.1" |
||||||
|
timing: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: timing |
||||||
|
sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.1" |
||||||
|
typed_data: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: typed_data |
||||||
|
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.2" |
||||||
|
vector_math: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: vector_math |
||||||
|
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.4" |
||||||
|
watcher: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: watcher |
||||||
|
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.0" |
||||||
|
web_socket_channel: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: web_socket_channel |
||||||
|
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.4.0" |
||||||
|
yaml: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: yaml |
||||||
|
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.1.2" |
||||||
|
sdks: |
||||||
|
dart: ">=3.0.0 <4.0.0" |
||||||
|
flutter: ">=3.3.0" |
@ -0,0 +1,94 @@ |
|||||||
|
name: adaptive_layout |
||||||
|
description: A new Flutter project. |
||||||
|
# The following line prevents the package from being accidentally published to |
||||||
|
# pub.dev using `flutter pub publish`. This is preferred for private packages. |
||||||
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev |
||||||
|
|
||||||
|
# The following defines the version and build number for your application. |
||||||
|
# A version number is three numbers separated by dots, like 1.2.43 |
||||||
|
# followed by an optional build number separated by a +. |
||||||
|
# Both the version and the builder number may be overridden in flutter |
||||||
|
# build by specifying --build-name and --build-number, respectively. |
||||||
|
# In Android, build-name is used as versionName while build-number used as versionCode. |
||||||
|
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning |
||||||
|
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. |
||||||
|
# Read more about iOS versioning at |
||||||
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html |
||||||
|
# In Windows, build-name is used as the major, minor, and patch parts |
||||||
|
# of the product and file versions while build-number is used as the build suffix. |
||||||
|
version: 1.0.0+1 |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: '>=3.0.0 <4.0.0' |
||||||
|
|
||||||
|
# Dependencies specify other packages that your package needs in order to work. |
||||||
|
# To automatically upgrade your package dependencies to the latest versions |
||||||
|
# consider running `flutter pub upgrade --major-versions`. Alternatively, |
||||||
|
# dependencies can be manually updated by changing the version numbers below to |
||||||
|
# the latest version available on pub.dev. To see which dependencies have newer |
||||||
|
# versions available, run `flutter pub outdated`. |
||||||
|
dependencies: |
||||||
|
# The following adds the Cupertino Icons font to your application. |
||||||
|
# Use with the CupertinoIcons class for iOS style icons. |
||||||
|
cupertino_icons: ^1.0.2 |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
flutter_adaptive_scaffold: ^0.1.3 |
||||||
|
go_router: ^7.1.1 |
||||||
|
intersperse: ^2.0.0 |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
build_runner: ^2.4.4 |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
# The "flutter_lints" package below contains a set of recommended lints to |
||||||
|
# encourage good coding practices. The lint set provided by the package is |
||||||
|
# activated in the `analysis_options.yaml` file located at the root of your |
||||||
|
# package. See that file for information about deactivating specific lint |
||||||
|
# rules and activating additional ones. |
||||||
|
go_router_builder: ^2.0.1 |
||||||
|
nit_picking: |
||||||
|
git: |
||||||
|
url: https://github.com/stack11/dart_nit_picking |
||||||
|
ref: 0b2ee0d |
||||||
|
|
||||||
|
# For information on the generic Dart part of this file, see the |
||||||
|
# following page: https://dart.dev/tools/pub/pubspec |
||||||
|
|
||||||
|
# The following section is specific to Flutter packages. |
||||||
|
flutter: |
||||||
|
# The following line ensures that the Material Icons font is |
||||||
|
# included with your application, so that you can use the icons in |
||||||
|
# the material Icons class. |
||||||
|
uses-material-design: true |
||||||
|
|
||||||
|
# To add assets to your application, add an assets section, like this: |
||||||
|
# assets: |
||||||
|
# - images/a_dot_burr.jpeg |
||||||
|
# - images/a_dot_ham.jpeg |
||||||
|
|
||||||
|
# An image asset can refer to one or more resolution-specific "variants", see |
||||||
|
# https://flutter.dev/assets-and-images/#resolution-aware |
||||||
|
|
||||||
|
# For details regarding adding assets from package dependencies, see |
||||||
|
# https://flutter.dev/assets-and-images/#from-packages |
||||||
|
|
||||||
|
# To add custom fonts to your application, add a fonts section here, |
||||||
|
# in this "flutter" section. Each entry in this list should have a |
||||||
|
# "family" key with the font family name, and a "fonts" key with a |
||||||
|
# list giving the asset and other descriptors for the font. For |
||||||
|
# example: |
||||||
|
# fonts: |
||||||
|
# - family: Schyler |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/Schyler-Regular.ttf |
||||||
|
# - asset: fonts/Schyler-Italic.ttf |
||||||
|
# style: italic |
||||||
|
# - family: Trajan Pro |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/TrajanPro.ttf |
||||||
|
# - asset: fonts/TrajanPro_Bold.ttf |
||||||
|
# weight: 700 |
||||||
|
# |
||||||
|
# For details regarding fonts from package dependencies, |
||||||
|
# see https://flutter.dev/custom-fonts/#from-packages |
Loading…
Reference in new issue