Line data Source code
1 : import 'dart:async'; 2 : 3 : import 'package:flutter/material.dart'; 4 : import 'package:pal/src/ui/shared/utilities/element_finder.dart'; 5 : 6 : import '../../../pal_navigator_observer.dart'; 7 : 8 : class FinderService { 9 : 10 : PalNavigatorObserver observer; 11 : 12 6 : FinderService({@required this.observer}); 13 : 14 2 : Future<ElementModel> searchChildElement(String key) async { 15 2 : var completer = new Completer<ElementModel>(); 16 8 : var currentRoute = await observer.route.first; 17 4 : if(WidgetsBinding.instance.hasScheduledFrame) { 18 0 : WidgetsBinding.instance.addPostFrameCallback((timeStamp) { 19 0 : ElementModel res = ElementFinder(currentRoute.subtreeContext).searchChildElement(key); 20 0 : completer.complete(res); 21 : }); 22 : } else { 23 6 : ElementModel res = ElementFinder(currentRoute.subtreeContext).searchChildElement(key); 24 2 : completer.complete(res); 25 : } 26 2 : return completer.future; 27 : } 28 : 29 2 : Future<Map<String, ElementModel>> scan({Key omitChildsOf, bool debugMode = false}) async { 30 2 : var completer = new Completer<Map<String, ElementModel>>(); 31 8 : var currentRoute = await observer.route.first; 32 4 : if(WidgetsBinding.instance.hasScheduledFrame) { 33 0 : WidgetsBinding.instance.addPostFrameCallback((timeStamp) { 34 0 : completer.complete(ElementFinder(currentRoute.subtreeContext).scan()); 35 : }); 36 : } else { 37 8 : completer.complete(ElementFinder(currentRoute.subtreeContext).scan()); 38 : } 39 2 : return completer.future; 40 : } 41 : 42 1 : Future<Rect> getLargestAvailableSpace(ElementModel element) async { 43 4 : var currentRoute = await observer.route.first; 44 3 : return ElementFinder(currentRoute.subtreeContext).getLargestAvailableSpace(element); 45 : } 46 : 47 : }