#flutter #dart
#flutter #dart
Вопрос:
Ошибка выдается при попытке перейти к следующему экрану. Я сталкивался с этим раньше, и добавление нового контекста в дерево обычно работает. На этот раз этого не произошло. Что я должен делать?
Error:
E/flutter (22865): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)]
Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null.
E/flutter (22865): Receiver: null
E/flutter (22865): Tried calling: findAncestorStateOfType()
class _LoginMainState extends State<LoginMain> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text('Sorted.'),
backgroundColor: Color(0xff0A3D62),
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: <Color>[
const Color(0xFF5761B2),
const Color(0xFF1FC588),
])),
),
),
drawer: null,
body: Container(
padding: EdgeInsets.only(top: 30),
width: 360,
height: 600,
color: const Color(0xFF273748),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: 300,
height: 400,
child: Container(
padding: EdgeInsets.all(15),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(20.0),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.white, Colors.grey[400]]),
),
child: SizedBox(
width: 50,
height: 50,
child: Container(
child: MaterialButton(
color: Colors.green,
splashColor: Colors.teal,
textColor: Colors.white,
child: new Icon(Icons.arrow_forward),
onPressed: () async {
bool res = await AuthProvider().loginWithGoogle();
if (res) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SortedMain()));
} else
print("Login failed");
Заранее спасибо!
Ответ №1:
Проблема в том, что над вашим контекстом нет контекста MaterialApp
. Navigator
Зависит от контекста MaterialApp
, и поскольку единственный доступный контекст находится над приложением, он выдает ошибку.
Вы упомянули, что сталкивались с этой проблемой раньше, и что вы исправили ее, добавив дополнительный контекст. Но вы не указали, куда вы его добавили.
Чтобы исправить это, просто оберните содержимое в вашем MaterialApp с помощью Builder
или переместите его в отдельный виджет без сохранения состояния.
class _LoginMainState extends State<LoginMain> {
@override
Widget build(BuildContext context) {
return MaterialApp(
// Added this
home: Builder(
builder: (context) => SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text('Sorted.'),
backgroundColor: Color(0xff0A3D62),
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: <Color>[
const Color(0xFF5761B2),
const Color(0xFF1FC588),
])),
),
),
drawer: null,
body: Container(
padding: EdgeInsets.only(top: 30),
width: 360,
height: 600,
color: const Color(0xFF273748),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: 300,
height: 400,
child: Container(
padding: EdgeInsets.all(15),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(20.0),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.white, Colors.grey[400]]),
),
child: SizedBox(
width: 50,
height: 50,
child: Container(
child: MaterialButton(
color: Colors.green,
splashColor: Colors.teal,
textColor: Colors.white,
child: new Icon(Icons.arrow_forward),
onPressed: () async {
bool res = await AuthProvider().loginWithGoogle();
if (res) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SortedMain()));
} else
print("Login failed");
И если это не сработает, просто переместите страницу в другой виджет (без состояния или с сохранением состояния).