Метод ‘findAncestorStateOfType’ был вызван при null

#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");

  

И если это не сработает, просто переместите страницу в другой виджет (без состояния или с сохранением состояния).