Check if popUntil possible / Check if named route in navigation stack - flutter

How can I check if there is a route with name workout in my navigation stack? Whenever I call popUntil and the route is not in my stack, I get:
════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building Navigator-[GlobalObjectKey<NavigatorState> _WidgetsAppState#9d229](dirty, state: NavigatorState#86712(tickers: tracking 2 tickers)):
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2330 pos 12: '!_debugLocked': is not true.
Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=BUG.md
The relevant error-causing widget was
MaterialApp
lib/main.dart:58
When the exception was thrown, this was the stack
#2 NavigatorState.build
package:flutter/…/widgets/navigator.dart:2330
#3 StatefulElement.build
package:flutter/…/widgets/framework.dart:4334
I have tried this but popUntil still throws the exception
try {
Navigator.popUntil(context, ModalRoute.withName('workout'));
} catch (e) {
Future.delayed(Duration(milliseconds: 1000), () {
Navigator.push(context, MaterialPageRoute(
builder: (_context) => WorkoutPage(),
settings: RouteSettings(name: 'workout'),
fullscreenDialog: true
));
});
}

If you are working on clearing the entire stack and showing a specific screen, you should try the below code:
Navigator.of(context).pushNamedAndRemoveUntil('/screen4', (Route route) => false);
It should do the work.

Related

[ERROR: '!navigator._debugLocked': is not true.]

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2845 pos 18: '!navigator._debugLocked': is not true.
That bug when run my app. I'm not fix. I try below code but not working
Future.delayed(Duration.zero, () {
Navigator.pushReplacement(context, PageTransition(
type: PageTransitionType.leftToRight,
child: HomeScreen(),
));
});
Stop your running app and reinstall the app to device
this is state issue

Why showcaseview throws error on first try?

Hey I am using ShowCaseView in my Flutterapp. When I first open my app, after registration there is no showcase, not even the icon which should be 'showcased' is shown. But when I am closing the app and opening it again it works just fine.
Thats the code referring to showcase:
class _HomeSearchPageState extends State<HomeSearchPage> {
final keyOne = GlobalKey();
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback(
(_) => ShowCaseWidget.of(context).startShowCase([
keyOne,
]),
);
}
And now the scaffold:
return Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(getTopBarSize()),
child: AppBar(
automaticallyImplyLeading: false,
title: Text(
'username',
style: TextStyle(fontSize: 14),
),
actions: <Widget>[
Showcase(
key: keyOne,
description: 'test',
child: IconButton(
icon: Icon(Icons.search),
onPressed: () {
showSearch(context: context, delegate: DataSearch())
.whenComplete(() => setName());
}),
),
],
),
),)
I did exactly the same as in the Github example but still it throws this error the first time:
════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building IconTheme(color: Color(0xffffffff)):
The getter 'activeWidgetIds' was called on null.
Receiver: null
Tried calling: activeWidgetIds
The relevant error-causing widget was
AppBar
lib\Views\HomeSearchPage.dart:182
When the exception was thrown, this was the stack
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 ShowCaseWidget.activeTargetWidget
package:showcaseview/showcase_widget.dart:51
#2 _ShowcaseState.showOverlay
package:showcaseview/showcase.dart:171
#3 _ShowcaseState.didChangeDependencies
package:showcaseview/showcase.dart:164
#4 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:4786
════════ Exception caught by rendering library ═════════════════════════════════
Each child must be laid out exactly once.
The relevant error-causing widget was
AppBar
lib\Views\HomeSearchPage.dart:182
════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by scheduler library ═════════════════════════════════
Exception: Please provide ShowCaseView context
════════ Exception caught by widgets library ═══════════════════════════════════
'package:flutter/src/widgets/framework.dart': Failed assertion: line 6224 pos 12: '_children.contains(child)': is not true.
The relevant error-causing widget was
AppBar
lib\Views\HomeSearchPage.dart:182
════════════════════════════════════════════════════════════════════════════════
These errors are kind a looped, so the debug console shows them all the time.
The only difference between the first app opening and the second one is: In the first one the user enters a registrationpage and after this he enters the page with the showcaseview. In the second the user enters directly the page with the showcaseview. How can this affect the showcase and more accurate why does this throw the errors?
Not sure if we share a similar issue but maybe my answer will help you somehow :). The issue occurs when I navigate to the page where I have Showcase widget, but it does not occur when I navigate "back" to the page from the other page.
Maybe you can check this page "This error is thrown if you haven't wrapped your widget with ShowCaseWidget. This is not the problem with the package itself."
Thus, I tried raising the level of the ShowCaseWidget in the main.dart and the issue was solved.
void main() {
// runApp(MyApp());
runApp(
ShowCaseWidget(
autoPlay: false,
autoPlayDelay: Duration(seconds: 8),
autoPlayLockEnable: false,
builder: Builder(
builder: (context) => MyApp(),
),
onStart: (index, key) {
print('onStart: $index, $key');
},
onComplete: (index, key) {
print('onComplete: $index, $key');
},
),
);
}
So far the app still works well. I will report again here in case any issues occur.

Can any one tell what is wrong with this Dialog?

I have this dialog But when I call it it gives me this error :
Unhandled Exception: 'package:flutter/src/widgets/localizations.dart': Failed assertion: line 453 pos 12: 'context != null': is not true.,
My Code:
return showDialog(
context: context,
child: AlertDialog(
title: Text(title),
content: Text(msg),
actions: [cancel, ok],
),
);
The error message tells you exactly what's wrong: your variable context is null.
You need to provide a context that is not null.
You should also provide builder instead of a child, because that way to build a dialog is deprecated for good reason.

How to fix "the method 'cancel' called on null" while working with http requests flutter

I'm trying to athenticate using APIs from a flutter app but i get these errors everytime i click Login Button
final resp = await http.post("http://192.168.73.5/myserv/login.php", body: {
"login": "login",
"apid": "re0b53fd92d4b1593db1880az322d66ea9d4",
"email": _email,
"pass": _password,
});
var __data =json.decode(resp.body);
if (__data.length == 0) {
final snackbar = SnackBar(
content: Text('Server error'),
);
scaffoldKey.currentState.showSnackBar(snackbar);
} else if (__data[0]['resp'] == 'error') {
final snackbar = SnackBar(
content: Text('Password or email is incorrect!'),
);
scaffoldKey.currentState.showSnackBar(snackbar);
} else if (__data[0]['resp'] == 'sucess') {
final snackbar = SnackBar(
content: Text('You are logged in'),
);
scaffoldKey.currentState.showSnackBar(snackbar);
Navigator.of(context)
.pushReplacement(MaterialPageRoute(builder: (context) => HomeApp()));
}
}
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (29517): The following NoSuchMethodError was thrown while finalizing the widget tree:
I/flutter (29517): The method 'cancel' was called on null.
I/flutter (29517): Receiver: null
I/flutter (29517): Tried calling: cancel()
I/flutter (29517): When the exception was thrown, this was the stack:
My suggestion would be to take a look to your dispose method. There you might notice a statement calling a cancel method on something that was never initiated or used, only declared. In my case I got this error because at the disposed method I was trying to cancel a subscription to a Firebase service that I had not used. I never attached a listener to it, therefore when trying to cancel it, Flutter complained saying "the method cancel was called on null". I deleted the unnecessary line at dispose method and the error resolved. Hope the explanation helps somebody.

Navigator.removeRoute & Navigator.removeRouteBelow

There are two functions in Navigator.dart, removeRoute and removeRouteBelow. I don't know how to use these two methods. This is the page route: / -> A -> B -> C -> D. And I perform this code in page D:
Navigator.removeRoute(context, MaterialPageRoute(builder: (context) => PushPageB()));
But there goes something wrong:
══╡ EXCEPTION CAUGHT BY GESTURE ╞═════════════════════════════════
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 1832 pos 12: 'route._navigator
== this': is not true.
Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new
When the exception was thrown, this was the stack:
2 NavigatorState.removeRoute (package:flutter/src/widgets/navigator.dart:1832:12)
3 Navigator.removeRoute (package:flutter/src/widgets/navigator.dart:1221:34)
4 PushPageE.build.<anonymous closure> (package:flutter_navigation/push_page_1.dart:223:29)
5 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
6 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
7 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
8 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
9 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)
10 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
11 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
12 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
13 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:143:19)
14 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
15 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
16 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
17 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
18 _invoke1 (dart:ui/hooks.dart:153:13)
19 _dispatchPointerDataPacket (dart:ui/hooks.dart:107:5)
(elided 2 frames from class _AssertionError)
Handler: onTap
Recognizer:
TapGestureRecognizer#2a91c(debugOwner: GestureDetector, state: possible, won arena, finalPosition:
Offset(211.1, 411.1), sent tap down)
══════════════════════════════════════════════════════════════════
I don't know why would this happened, and how use these two methods correctly.
The MaterialPageRoute you have created inside Navigator.removeRoute call has no connection to the Navigator because it wasn't pushed yet. Therefore you've got an error.
In order to use removeRoute method correctly you need to remeber a route you pushed to the Navigator.
I am using following code to keep just one instance of a page in the Navigator.
var filterRoutes = <String, MaterialPageRoute<dynamic>>{'page1': null, 'page2': null, 'page3': null, 'page4': null};
MaterialPageRoute getNextRoute(BuildContext context, String nextPage) {
var route;
switch (nextPage) {
case 'page1':
route = MaterialPageRoute(builder: (context) => Page1());
break;
case 'page2':
route = MaterialPageRoute(builder: (context) => Page2());
break;
case 'page3':
route = MaterialPageRoute(builder: (context) => Page3());
break;
case 'page4':
route = MaterialPageRoute(builder: (context) => Page4());
break;
default:
route = MaterialPageRoute(builder: (context) => SomeOtherPage());
}
if (nextPage != null) {
if (filterRoutes[nextPage] != null) {
Navigator.removeRoute(context, filterRoutes[nextPage]);
}
filterRoutes[nextPage] = route;
}
return route;
}
If you want to remove blow router and go to new route like logout from setting and go to login page, you can do this:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
LoginScreen()), (Route<dynamic> route) => false);