I am trying to change screen on push button. But somehow the context has no Navigator as the error suggests:
Navigator operation requested with a context that does not include a Navigator.
The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
When the exception was thrown, this was the stack:
#0 Navigator.of.<anonymous closure> (package:flutter/src/widgets/navigator.dart:2554:9)
#1 Navigator.of (package:flutter/src/widgets/navigator.dart:2561:6)
#2 _MyAppState.build.<anonymous closure>.<anonymous closure> (package:base_app/main.dart:64:35)
#3 _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1072:21)
#4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:253:24)
#5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:627:11)
#6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:306:5)
#7 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:239:7)
However, according to this message there is a Navigator in #0 and #1 so what is the problem?
Mycode:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_authenticator/amplify_authenticator.dart';
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:flutter/material.dart';
import 'package:base_app/add_device.dart';
import 'amplifyconfiguration.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isAmplifyConfigured = false;
@override
void initState() {
super.initState();
_configureAmplify();
}
void _configureAmplify() async {
try {
await Amplify.addPlugin(AmplifyAuthCognito());
await Amplify.configure(amplifyconfig);
setState(() => _isAmplifyConfigured = true);
print('Successfully configured');
} on Exception catch (e) {
print('Error configuring Amplify: $e');
}
}
Future<bool> isUserSignedIn() async {
final result = await Amplify.Auth.fetchAuthSession();
return result.isSignedIn;
}
@override
Widget build(BuildContext context) {
return Authenticator(
child: MaterialApp(
builder: Authenticator.builder(),
home: _isAmplifyConfigured? FutureBuilder(
future: isUserSignedIn(),
builder: (BuildContext ctx, AsyncSnapshot snapshot) {
if (snapshot.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
} else {
return Scaffold(
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
onPressed: () => {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => AddDevice())),
},
child: Icon(Icons.add),
)
);
}
}): Text("not logged in")
),
);
}
}
This is a basic code of a more complex app but even here it does not work. I tried several suggestions from other posts with all the same result.
CodePudding user response:
This error happened because you use a context
that is a parent of MaterialApp
, try use builder's context
which is ctx
, like this:
Scaffold(
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
onPressed: () => {
Navigator.of(ctx).push(
MaterialPageRoute(builder: (context) => AddDevice())),
},
child: Icon(Icons.add),
)
)