Jonny Borges

update get navigation

No preview for this file type
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# 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/
# Web related
lib/generated_plugin_registrant.dart
# 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
# 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 and should not be manually edited.
version:
revision: b22742018b3edf16c6cadd7b76d9db5e7f9064b5
channel: stable
project_type: app
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
package io.flutter.plugins;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.Log;
import io.flutter.embedding.engine.FlutterEngine;
/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
private static final String TAG = "GeneratedPluginRegistrant";
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
}
}
... ...
sdk.dir=/Users/jonatasborges/Library/Android/sdk
flutter.sdk=/Users/jonatasborges/flutter
\ No newline at end of file
... ...
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
// This is a generated file; do not edit or check into version control.
FLUTTER_ROOT=/Users/jonatasborges/flutter
FLUTTER_APPLICATION_PATH=/Users/jonatasborges/consertar/getx/example_nav2
COCOAPODS_PARALLEL_CODE_SIGN=true
FLUTTER_TARGET=/Users/jonatasborges/consertar/getx/example_nav2/lib/main.dart
FLUTTER_BUILD_DIR=build
FLUTTER_BUILD_NAME=1.0.0
FLUTTER_BUILD_NUMBER=1
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==
DART_OBFUSCATION=false
TRACK_WIDGET_CREATION=true
TREE_SHAKE_ICONS=false
PACKAGE_CONFIG=/Users/jonatasborges/consertar/getx/example_nav2/.dart_tool/package_config.json
... ...
#!/bin/sh
# This is a generated file; do not edit or check into version control.
export "FLUTTER_ROOT=/Users/jonatasborges/flutter"
export "FLUTTER_APPLICATION_PATH=/Users/jonatasborges/consertar/getx/example_nav2"
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
export "FLUTTER_TARGET=/Users/jonatasborges/consertar/getx/example_nav2/lib/main.dart"
export "FLUTTER_BUILD_DIR=build"
export "FLUTTER_BUILD_NAME=1.0.0"
export "FLUTTER_BUILD_NUMBER=1"
export "DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ=="
export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=true"
export "TREE_SHAKE_ICONS=false"
export "PACKAGE_CONFIG=/Users/jonatasborges/consertar/getx/example_nav2/.dart_tool/package_config.json"
... ...
//
// Generated file. Do not edit.
//
// clang-format off
#ifndef GeneratedPluginRegistrant_h
#define GeneratedPluginRegistrant_h
#import <Flutter/Flutter.h>
NS_ASSUME_NONNULL_BEGIN
@interface GeneratedPluginRegistrant : NSObject
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;
@end
NS_ASSUME_NONNULL_END
#endif /* GeneratedPluginRegistrant_h */
... ...
//
// Generated file. Do not edit.
//
// clang-format off
#import "GeneratedPluginRegistrant.h"
@implementation GeneratedPluginRegistrant
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
}
@end
... ...
... ... @@ -31,7 +31,9 @@ class LoginView extends GetView<LoginController> {
),
onPressed: () {
AuthService.to.login();
final thenTo = context.params['then'];
print(context.navigation.currentConfiguration?.route?.parameters);
Get.offNamed(thenTo ?? Routes.home);
},
),
... ...
... ... @@ -15,10 +15,11 @@ class ProductsView extends GetView<ProductsController> {
),
body: Column(
children: [
Hero(
tag: 'heroLogo',
child: const FlutterLogo(),
),
// Hero(
// tag: 'heroLogo',
// child:
const FlutterLogo(),
// ),
Expanded(
child: Obx(
() => RefreshIndicator(
... ...
flutter/ephemeral/
# Visual Studio user-specific files.
*.suo
*.user
*.userosscache
*.sln.docstates
# Visual Studio build-related files.
x64/
x86/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
... ... @@ -5,6 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
... ... @@ -13,3 +16,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
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}/windows plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)
... ...
... ... @@ -45,7 +45,7 @@ class GetPage<T> extends Page<T> {
final List<GetPage> children;
final List<GetMiddleware>? middlewares;
final PathDecoded path;
// final PathDecoded path;
final GetPage? unknownRoute;
final bool showCupertinoParallax;
... ... @@ -82,7 +82,7 @@ class GetPage<T> extends Page<T> {
PreventDuplicateHandlingMode.reorderRoutes,
this.completer,
LocalKey? key,
}) : path = _nameToRegex(name),
}) : // path = _nameToRegex(name),
assert(name.startsWith('/'),
'It is necessary to start route name [$name] with a slash: /$name'),
super(
... ... @@ -168,26 +168,26 @@ class GetPage<T> extends Page<T> {
return _page;
}
static PathDecoded _nameToRegex(String path) {
var keys = <String?>[];
// static PathDecoded _nameToRegex(String path) {
// var keys = <String?>[];
String _replace(Match pattern) {
var buffer = StringBuffer('(?:');
// String _replace(Match pattern) {
// var buffer = StringBuffer('(?:');
if (pattern[1] != null) buffer.write('.');
buffer.write('([\\w%+-._~!\$&\'()*,;=:@]+))');
if (pattern[3] != null) buffer.write('?');
// if (pattern[1] != null) buffer.write('.');
// buffer.write('([\\w%+-._~!\$&\'()*,;=:@]+))');
// if (pattern[3] != null) buffer.write('?');
keys.add(pattern[2]);
return "$buffer";
}
// keys.add(pattern[2]);
// return "$buffer";
// }
var stringPath = '$path/?'
.replaceAllMapped(RegExp(r'(\.)?:(\w+)(\?)?'), _replace)
.replaceAll('//', '/');
// var stringPath = '$path/?'
// .replaceAllMapped(RegExp(r'(\.)?:(\w+)(\?)?'), _replace)
// .replaceAll('//', '/');
return PathDecoded(RegExp('^$stringPath\$'), keys);
}
// return PathDecoded(RegExp('^$stringPath\$'), keys);
// }
@override
bool operator ==(Object other) {
... ... @@ -205,20 +205,20 @@ class GetPage<T> extends Page<T> {
}
}
@immutable
class PathDecoded {
final RegExp regex;
final List<String?> keys;
const PathDecoded(this.regex, this.keys);
// @immutable
// class PathDecoded {
// final RegExp regex;
// final List<String?> keys;
// const PathDecoded(this.regex, this.keys);
@override
int get hashCode => regex.hashCode;
// @override
// int get hashCode => regex.hashCode;
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
// @override
// bool operator ==(Object other) {
// if (identical(this, other)) return true;
return other is PathDecoded &&
other.regex == regex; // && listEquals(other.keys, keys);
}
}
// return other is PathDecoded &&
// other.regex == regex; // && listEquals(other.keys, keys);
// }
// }
... ...
... ... @@ -26,28 +26,31 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
List<RouteDecoder> get activePages => _activePages;
final _routeTree = ParseRouteTree(routes: []);
final _routeTree = ParseRouteTree();
List<GetPage> get registeredRoutes => _routeTree.routes;
final List<GetPage> _routes = [];
List<GetPage> get registeredRoutes => _routes;
void addPages(List<GetPage> getPages) {
_routeTree.addRoutes(getPages);
_routes.addRoutes(getPages);
}
void clearRouteTree() {
_routeTree.routes.clear();
_routes.clear();
}
void addPage(GetPage getPage) {
_routeTree.addRoute(getPage);
_routes.addRoute(getPage);
}
void removePage(GetPage getPage) {
_routeTree.removeRoute(getPage);
_routes.removeRoute(getPage);
}
RouteDecoder matchRoute(String name, {PageSettings? arguments}) {
return _routeTree.matchRoute(name, arguments: arguments);
RouteDecoder? matchRoute(String name, {PageSettings? arguments}) {
final settings = _buildPageSettings(name, arguments);
return _getRouteDecoder(settings);
}
// GlobalKey<NavigatorState> get navigatorKey => Get.key;
... ... @@ -138,7 +141,9 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
}
Map<String, String> get parameters {
return currentConfiguration?.pageSettings?.params ?? {};
return currentConfiguration?.route?.parameters ??
// currentConfiguration?.pageSettings?.params ??
{};
}
PageSettings? get pageSettings {
... ... @@ -379,14 +384,14 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
preventDuplicateHandlingMode: preventDuplicateHandlingMode,
);
_routeTree.addRoute(getPage);
_routes.addRoute(getPage);
final args = _buildPageSettings(routeName, arguments);
final route = _getRouteDecoder<T>(args);
final result = await _push<T>(
route!,
rebuildStack: rebuildStack,
);
_routeTree.removeRoute(getPage);
_routes.removeRoute(getPage);
return result;
}
... ... @@ -623,7 +628,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
Future<T?> _replace<T>(PageSettings arguments, GetPage<T> page) async {
final index = _activePages.length > 1 ? _activePages.length - 1 : 0;
_routeTree.addRoute(page);
_routes.addRoute(page);
final activePage = _getRouteDecoder(arguments);
... ... @@ -633,7 +638,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
notifyListeners();
final result = await activePage.route?.completer?.future as Future<T?>?;
_routeTree.removeRoute(page);
_routes.removeRoute(page);
return result;
}
... ... @@ -678,7 +683,8 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
page = uri.toString();
}
final decoder = _routeTree.matchRoute(page, arguments: arguments);
final decoder =
_routeTree.matchRoute(registeredRoutes, page, arguments: arguments);
final route = decoder.route;
if (route == null) return null;
... ... @@ -701,7 +707,7 @@ class GetDelegate extends RouterDelegate<RouteDecoder>
completer: _activePages.isEmpty ? null : Completer(),
arguments: arguments,
parameters: parameters,
key: ValueKey(arguments.name),
// key: ValueKey(arguments.name),
);
return decoder;
... ...
import 'dart:math';
import 'package:flutter/foundation.dart';
import '../../../route_manager.dart';
... ... @@ -16,10 +18,11 @@ class RouteDecoder {
final args = PageSettings(uri);
final decoder = (Get.rootController.routerDelegate as GetDelegate)
.matchRoute(location, arguments: args);
decoder.route = decoder.route?.copy(
decoder!.route = decoder.route?.copy(
completer: null,
arguments: args,
parameters: args.params,
parameters: decoder.parameters,
);
return decoder;
}
... ... @@ -78,96 +81,62 @@ class RouteDecoder {
}
class ParseRouteTree {
ParseRouteTree({
required this.routes,
});
final List<GetPage> routes;
RouteDecoder matchRoute(String name, {PageSettings? arguments}) {
final uri = Uri.parse(name);
// /home/profile/123 => home,profile,123 => /,/home,/home/profile,/home/profile/123
final split = uri.path.split('/').where((element) => element.isNotEmpty);
var curPath = '/';
final cumulativePaths = <String>[
'/',
];
for (var item in split) {
if (curPath.endsWith('/')) {
curPath += item;
} else {
curPath += '/$item';
}
cumulativePaths.add(curPath);
}
final treeBranch = cumulativePaths
.map((e) => MapEntry(e, _findRoute(e)))
.where((element) => element.value != null)
///Prevent page be disposed
.map((e) => MapEntry(e.key, e.value!.copy(key: ValueKey(e.key))))
.toList();
final params = Map<String, String>.from(uri.queryParameters);
if (treeBranch.isNotEmpty) {
//route is found, do further parsing to get nested query params
final lastRoute = treeBranch.last;
final parsedParams = _parseParams(name, lastRoute.value.path);
if (parsedParams.isNotEmpty) {
params.addAll(parsedParams);
}
//copy parameters to all pages.
final mappedTreeBranch = treeBranch
.map(
(e) => e.value.copy(
parameters: {
if (e.value.parameters != null) ...e.value.parameters!,
...params,
},
name: e.key,
),
)
.toList();
arguments?.params.clear();
arguments?.params.addAll(params);
return RouteDecoder(
mappedTreeBranch,
arguments,
RouteDecoder matchRoute(List<GetPage> routes, String name,
{PageSettings? arguments}) {
final args = arguments ?? PageSettings(Uri.parse(name));
final treeBranch = routes
.where((e) => RouteParser.hasMatch(
pushedRoute: name, routeName: e.name, withChildren: true))
.map((e) {
final parameters =
RouteParser.parse(pushedRoute: name, routeName: e.name).parameters;
final routeParams = e.parameters;
if (routeParams != null) {
parameters.addAll(routeParams);
}
if (args.params.isNotEmpty) {
parameters.addAll(args.params);
}
args.params.clear();
args.params.addAll(parameters);
return e.copy(
settings: args,
parameters: parameters,
);
}
arguments?.params.clear();
arguments?.params.addAll(params);
}).toList();
//route not found
return RouteDecoder(
treeBranch.map((e) => e.value).toList(),
treeBranch,
arguments,
);
}
}
void addRoutes<T>(List<GetPage<T>> getPages) {
extension FirstWhereOrNullExt<T> on List<GetPage<T>> {
void addRoutes(List<GetPage<T>> getPages) {
for (final route in getPages) {
addRoute(route);
}
}
void removeRoutes<T>(List<GetPage<T>> getPages) {
void removeRoutes(List<GetPage<T>> getPages) {
for (final route in getPages) {
removeRoute(route);
}
}
void removeRoute<T>(GetPage<T> route) {
routes.remove(route);
void removeRoute(GetPage<T> route) {
remove(route);
for (var page in _flattenPage(route)) {
removeRoute(page);
}
}
void addRoute<T>(GetPage<T> route) {
routes.add(route);
void addRoute(GetPage<T> route) {
add(route);
// Add Page children.
for (var page in _flattenPage(route)) {
... ... @@ -175,14 +144,15 @@ class ParseRouteTree {
}
}
List<GetPage> _flattenPage(GetPage route) {
final result = <GetPage>[];
List<GetPage<T>> _flattenPage(GetPage<T> route) {
final result = <GetPage<T>>[];
if (route.children.isEmpty) {
return result;
}
final parentPath = route.name;
var parentPathOld = route.name;
for (var page in route.children) {
final parentPath2 = (parentPathOld + page.name).replaceAll(r'//', '/');
// Add Parent middlewares to children
final parentMiddlewares = [
if (page.middlewares != null) ...page.middlewares!,
... ... @@ -190,71 +160,146 @@ class ParseRouteTree {
];
result.add(
_addChild(
page,
parentPath,
page as GetPage<T>,
parentPath2,
parentMiddlewares,
),
);
final children = _flattenPage(page);
for (var child in children) {
result.add(_addChild(
child,
parentPath,
[
...parentMiddlewares,
if (child.middlewares != null) ...child.middlewares!,
],
));
}
// for (var child in children) {
// final parentPath = (parentPath2 + page.name).replaceAll(r'//', '/');
// result.add(_addChild(
// child,
// parentPath,
// [
// ...parentMiddlewares,
// if (child.middlewares != null) ...child.middlewares!,
// ],
// ));
// }
}
return result;
}
/// Change the Path for a [GetPage]
GetPage _addChild(
GetPage origin, String parentPath, List<GetMiddleware> middlewares) {
GetPage<T> _addChild(
GetPage<T> origin, String parentPath, List<GetMiddleware> middlewares) {
return origin.copy(
middlewares: middlewares,
name: (parentPath + origin.name).replaceAll(r'//', '/'),
// key:
name: parentPath,
key: ValueKey(parentPath),
);
}
GetPage? _findRoute(String name) {
final value = routes.firstWhereOrNull(
(route) => route.path.regex.hasMatch(name),
);
// GetPage<T>? _findRoute(String name) {
// final value = firstWhereOrNull(
// (route) => route.path.regex.hasMatch(name),
// );
return value;
// return value;
// }
}
extension FirstWhereExt<T> on List<T> {
/// The first element satisfying [test], or `null` if there are none.
T? firstWhereOrNull(bool Function(T element) test) {
for (var element in this) {
if (test(element)) return element;
}
return null;
}
}
class RouteParser {
static RouteParser parse({required String pushedRoute, required routeName}) {
final data = RouteParser(pushedRoute: pushedRoute, routeName: routeName);
Map<String, String> _parseParams(String path, PathDecoded routePath) {
final params = <String, String>{};
var idx = path.indexOf('?');
if (idx > -1) {
path = path.substring(0, idx);
final uri = Uri.tryParse(path);
if (uri != null) {
params.addAll(uri.queryParameters);
final minLength =
min(data.originalPathSegments.length, data.newPathSegments.length);
for (var i = 0; i < minLength; i++) {
final originalPathSegment = data.originalPathSegments[i];
final newPathSegment = Uri.parse(data.newPathSegments[i]);
if (originalPathSegment.startsWith(':')) {
final key = originalPathSegment.replaceFirst(':', '');
data.parameters[key] = newPathSegment.toString();
data.matchingSegments.add(newPathSegment);
continue;
}
if (newPathSegment.path == originalPathSegment) {
data.matchingSegments.add(newPathSegment);
data.parameters.addAll(data.newRouteUri.queryParameters);
continue;
} else {
break;
}
}
var paramsMatch = routePath.regex.firstMatch(path);
for (var i = 0; i < routePath.keys.length; i++) {
var param = Uri.decodeQueryComponent(paramsMatch![i + 1]!);
params[routePath.keys[i]!] = param;
return data;
}
return params;
static bool hasMatch({
required String pushedRoute,
required routeName,
bool withChildren = false,
}) {
final data = RouteParser(pushedRoute: pushedRoute, routeName: routeName);
final matches = <bool>[];
final minLength =
min(data.originalPathSegments.length, data.newPathSegments.length);
if ((!withChildren &&
data.newPathSegments.length > data.originalPathSegments.length) ||
data.newPathSegments.length < data.originalPathSegments.length) {
matches.add(false);
}
}
extension FirstWhereOrNullExt<T> on List<T> {
/// The first element satisfying [test], or `null` if there are none.
T? firstWhereOrNull(bool Function(T element) test) {
for (var element in this) {
if (test(element)) return element;
for (var i = 0; i < minLength; i++) {
final originalPathSegment = data.originalPathSegments[i];
final newPathSegment = Uri.parse(data.newPathSegments[i]);
if (originalPathSegment.startsWith(':')) {
matches.add(true);
continue;
}
return null;
if (newPathSegment.path == originalPathSegment) {
matches.add(true);
continue;
} else {
matches.add(false);
break;
}
}
return matches.every((element) => element);
}
RouteParser({required String routeName, required String pushedRoute})
: _cleanRouteName = '/' +
routeName
.replaceAll(RegExp(r'^\s+|\s+$'), '')
.replaceAll(RegExp(r'^\/+|\/+$'), ''),
newRouteUri = Uri.parse(pushedRoute) {
originalRouteUri = Uri(path: _cleanRouteName);
}
late final Uri originalRouteUri;
final Uri newRouteUri;
final Map<String, String> parameters = <String, String>{};
final List<Uri> matchingSegments = <Uri>[];
final String _cleanRouteName;
List<String> get newPathSegments => newRouteUri.pathSegments;
List<String> get originalPathSegments => originalRouteUri.pathSegments;
String get matchingPath => '/' + matchingSegments.join('/');
@override
String toString() =>
'RouteParser(originalRouteUri: $originalRouteUri, newRouteUri: $newRouteUri, _cleanRouteName: $_cleanRouteName)';
}
... ...
... ... @@ -234,8 +234,9 @@ class PageRedirect {
if (settings == null && route != null) {
settings = route;
}
final match = context.navigation.matchRoute(settings!.name!);
Get.parameters = match.parameters;
final match = context.navigation
.matchRoute((settings!.arguments as PageSettings).name);
Get.parameters = match!.parameters;
// No Match found
if (match.route == null) {
... ...
... ... @@ -147,7 +147,8 @@ class GetRouterOutlet extends RouterOutlet<GetDelegate, RouteDecoder> {
return ret;
},
emptyPage: (delegate) =>
delegate.matchRoute(initialRoute).route ?? delegate.notFoundRoute,
delegate.matchRoute(initialRoute)?.route ??
delegate.notFoundRoute,
key: Get.nestedKey(anchorRoute)?.navigatorKey,
delegate: delegate,
);
... ...
... ... @@ -452,7 +452,8 @@ class BindElement<T> extends InheritedElement {
_controllerBuilder = () => Get.find<T>(tag: widget.tag);
} else {
_controllerBuilder = widget.create?.call(this) ?? widget.init;
_controllerBuilder =
() => (widget.create?.call(this) ?? widget.init?.call());
_isCreator = true;
if (widget.lazy) {
Get.lazyPut<T>(_controllerBuilder!, tag: widget.tag);
... ...
name: get
description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX.
version: 5.0.0-beta.50
version: 5.0.0-beta.51
homepage: https://github.com/jonataslaw/getx
environment:
... ...
No preview for this file type
... ... @@ -4,7 +4,7 @@ import 'package:get/get.dart';
void main() {
test('Parse Page with children', () {
final testParams = {'hi': 'value'};
// final testParams = {'hi': 'value'};
final pageTree = GetPage(
name: '/city',
page: () => Container(),
... ... @@ -40,7 +40,7 @@ void main() {
name: '/pen',
transition: Transition.cupertino,
page: () => Container(),
parameters: testParams,
// parameters: testParams,
),
GetPage(
name: '/paper',
... ... @@ -58,20 +58,63 @@ void main() {
),
],
);
final routes = <GetPage>[];
final tree = ParseRouteTree();
final tree = ParseRouteTree(routes: <GetPage>[]);
tree.addRoute(pageTree);
routes.addRoute(pageTree);
// tree.addRoute(pageTree);
final searchRoute = '/city/work/office/pen';
final match = tree.matchRoute(searchRoute);
final match = tree.matchRoute(routes, searchRoute);
expect(match, isNotNull);
expect(match.route!.name, searchRoute);
final testRouteParam = match.route!.parameters!;
final testRouteParam = match.parameters;
print(testRouteParam);
// for (final tParam in testParams.entries) {
// expect(testRouteParam[tParam.key], tParam.value);
// }
});
test('Parse ', () {
final testParams = {'hi': 'value'};
final pageTree = GetPage(
name: '/city',
parameters: testParams,
page: () => Container(),
);
final routes = <GetPage>[];
final tree = ParseRouteTree();
routes.addRoute(pageTree);
// tree.addRoute(pageTree);
final searchRoute = '/city?abc=1234';
final hasMatch = RouteParser.hasMatch(
pushedRoute: searchRoute, routeName: pageTree.name);
expect(hasMatch, true);
final parsed =
RouteParser.parse(pushedRoute: searchRoute, routeName: pageTree.name);
final match = tree.matchRoute(routes, searchRoute);
expect(match, isNotNull);
expect(parsed.newRouteUri.toString(), searchRoute);
final testRouteParam = match.route?.parameters;
for (final tParam in testParams.entries) {
expect(testRouteParam[tParam.key], tParam.value);
expect(testRouteParam![tParam.key], tParam.value);
}
final hasMatch2 = RouteParser.hasMatch(
pushedRoute: '/home/123/ana', routeName: '/home/:id/:name');
print(hasMatch2);
expect(hasMatch2, true);
final parsed2 = RouteParser.parse(
pushedRoute: '/home/123/ana/profile',
routeName: '/home/:id/:name/profile');
print(parsed2.parameters);
});
test('Parse Page without children', () {
... ... @@ -114,14 +157,14 @@ void main() {
transition: Transition.rightToLeft),
];
final tree = ParseRouteTree(routes: pageTree);
final tree = ParseRouteTree();
// for (var p in pageTree) {
// tree.addRoute(p);
// }
final searchRoute = '/city/work/office/pen';
final match = tree.matchRoute(searchRoute);
final match = tree.matchRoute(pageTree, searchRoute);
expect(match, isNotNull);
expect(match.route!.name, searchRoute);
});
... ... @@ -139,6 +182,8 @@ void main() {
],
));
print(Get.parameters);
expect(Get.parameters['name'], 'juan');
Get.toNamed('/second/1234');
... ...
... ... @@ -59,25 +59,25 @@ void main() {
test('interval', () async {
final count = 0.obs;
int? result = -1;
interval(count, (dynamic _) {
// print(_);
result = _ as int?;
interval<int>(count, (v) {
print(v);
result = v;
}, time: Duration(milliseconds: 100));
count.value++;
await Future.delayed(Duration.zero);
await Future.delayed(Duration(milliseconds: 100));
expect(1, result);
expect(result, 1);
count.value++;
count.value++;
count.value++;
await Future.delayed(Duration.zero);
await Future.delayed(Duration(milliseconds: 100));
expect(2, result);
expect(result, 2);
count.value++;
await Future.delayed(Duration.zero);
await Future.delayed(Duration(milliseconds: 100));
expect(5, result);
expect(result, 5);
});
test('bindStream test', () async {
... ... @@ -128,6 +128,7 @@ void main() {
reactiveInteger.trigger(3);
await Future.delayed(Duration(milliseconds: 100));
print(timesCalled);
expect(3, timesCalled);
});
... ...