首页 > 解决方案 > 在 null 上调用了方法“ancestorStateOfType”。(环形)

问题描述

首先,我是 Flutter 的初学者。我正在将表单数据发送到登录 API 并等待成功:来自 API 的 OK 消息和用户 ID。

获得用户 ID 和成功后:来自 API 的 OK 响应我将用户发送到带有用户 ID 的仪表板这是我的完整代码;

    class LoginScreen1 extends StatefulWidget {
  @override
  _LoginScreen1State createState() => _LoginScreen1State();
}

class _LoginScreen1State extends State<LoginScreen1> {
  StreamSubscription streamSubscription;

  String formMail, formSifre;

  final _usernameController = TextEditingController();
  final _passwordController = TextEditingController();

  final formKey = GlobalKey<FormState>();

  Login login;

  Future<Login> _gonderiGetir(String formMail, String formSifre) async {

    var url = 'MYURL';
    var apiKey = "MYKEY";
    var authPassword = this.formSifre;
    var authMail = this.formMail;
    debugPrint(this.formSifre);

    var response = await http
        .get('$url?Key=12345&mail=${this.formMail}&password=${this.formSifre}');
    debugPrint("Sonuç Bekleniyor.");

    if (response.statusCode == 200) {
      _gelenDegeriBekle();

      return Login.fromJsonMap(json.decode(response.body));
    } else {
      throw Exception("Baglanamadık ${response.statusCode}");
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    /*_gonderiGetir(formSifre, formMail).then((gelenDeger) {
      login = gelenDeger;
      debugPrint(login.UserID);
    });*/
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Color(0xFFF7F8FA),
        child: ListView(
          children: <Widget>[
            Stack(
              children: <Widget>[
                Container(
                  height: 250.0,
                  width: double.infinity,
                ),
                Container(
                  height: 300.0,
                  width: double.infinity,
                  color: Color(0xFFFED428),
                ),
                Positioned(
                    top: 225.0,
                    left: 15.0,
                    right: 15.0,
                    child: Material(
                      elevation: 3.0,
                      borderRadius: BorderRadius.circular(7.0),
                      child: Container(
                        height: 280.0,
                        decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(7.0),
                            color: Color(0xF6F6F6)),
                      ),
                    )),
                Positioned(
                  top: 75.0,
                  left: (MediaQuery.of(context).size.width / 2 - 50.0),
                  child: CircleAvatar(
                    radius: 50.0,
                    backgroundImage: NetworkImage(
                        "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSHVRLWSF79r7ABstLzXZi_pTcNkAMqx8EtWfIRZiA8mmqcl-Fsqw"),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.fromLTRB(40, 235, 40, 15),
                  child: Form(
                    key: formKey,
                    autovalidate: true,
                    child: Column(
                      children: <Widget>[
                        TextFormField(
                          decoration: const InputDecoration(
                            labelStyle: TextStyle(color: Color(0xFFBBBFCB)),
                            icon: Icon(
                              Icons.person,
                              color: Color(0xFFBBBFCB),
                            ),
                            labelText: 'Email *',
                          ),
                          validator: (String girilenVeri) {
                            if (!girilenVeri.contains("@")) {
                              return "Geçerli bir mail adresi giriniz.";
                            } else
                              return null;
                          },
                          controller: _usernameController,
                          onSaved: (deger) => formMail = deger,
                        ),
                        SizedBox(
                          height: 10.0,
                        ),
                        TextFormField(
                          obscureText: true,
                          decoration: const InputDecoration(
                            labelStyle: TextStyle(color: Color(0xFFBBBFCB)),
                            icon: Icon(
                              Icons.lock,
                              color: Color(0xFFBBBFCB),
                            ),
                            labelText: 'Şifre  *',
                          ),
                          validator: (String girilenVeri) {
                            if (girilenVeri.length < 6) {
                              return "Şifre 6 karakterden kısa olamaz.";
                            } else
                              return null;
                          },
                          controller: _passwordController,
                          onSaved: (deger) => formSifre = deger,
                        ),
                      ],
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.fromLTRB(40, 420, 40, 15),
                  child: Center(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        SizedBox(
                          width: double.infinity,
                          height: 50,
                          child: RaisedButton(
                            elevation: 0,
                            shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(10.0)),
                            color: Color(0xFFFED428),
                            onPressed: () {
                              if (formKey.currentState.validate()) {
                                formKey.currentState.save();
                                _gonderiGetir(formMail, formSifre);
                                debugPrint("OnPress Geldi");
                              }
                            },
                            child: Text(
                              "GİRİŞ",
                              style: TextStyle(fontSize: 20),
                            ),
                          ),
                        ),
                        FlatButton(
                          onPressed: () {},
                          child: Text(
                            "Şifremi Unuttum",
                            style: TextStyle(
                                fontSize: 10, color: Color(0xFFBBBFCB)),
                          ),
                        )
                      ],
                    ),
                  ),
                ),
              ],
            )
          ],
        ),
      ),
    );
    ;
  }

  void _loginControl() {
    if (formKey.currentState.validate()) {
      formKey.currentState.save();

      //formMail = _usernameController.text;
      //formSifre= _passwordController.text;



      debugPrint("$formSifre ve $formMail");


    }
  }

  void _gelenDegeriBekle() {
    _gonderiGetir(formSifre, formMail).then((gelenDeger) {
      login = gelenDeger;

      if (login.Status != null) {
        debugPrint(login.UserID);
        debugPrint(login.Status);

        Navigator.pushReplacement(
          context,
          MaterialPageRoute(
            builder: (context) => MyHomePage(),
          ),
        );

      }
    });
  }
}

但是我收到了这个循环错误:

 flutter: asdasd
    flutter: 387ddd00-f5ed-4c9c-87cf-45835bf77a53
    flutter: OK
    [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: NoSuchMethodError: The method 'ancestorStateOfType' was called on null.
    Receiver: null
    Tried calling: ancestorStateOfType(Instance of 'TypeMatcher<NavigatorState>')
    #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
    #1      Navigator.of (package:flutter/src/widgets/navigator.dart:1376:19)
    #2      Navigator.pushReplacement (package:flutter/src/widgets/navigator.dart:1055:22)
    #3      _LoginScreen1State._gelenDegeriBekle.<anonymous closure> (package:flutter_apppp/login.dart:247:19)
    #4      _rootRunUnary (dart:async/zone.dart:1132:38)
    #5      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
    #6      _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
    #7      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
    #8      Future._propagateToListeners (dart:async/future_impl.dart:668:32)
    #9      Future._complete (dart:async/future_impl.dart:473:7)
    #10     _SyncCompleter.complete (dart:<…&gt;

我不断收到此错误消息。

标签: dartflutter

解决方案


看起来您有一个循环在您的小部件中持续运行。您正在调用_gonderiGetirfrom_gelenDegeriBekle并且还调用_gelenDegeriBeklefrom _gonderiGetircontext因此,即使您的小部件已被删除(这就是为什么为空),它也会永远这样做。

如果您需要连续做某事,我建议您改用周期性计时器来调用它,并确保在您的小部件被处理时停止计时器!


推荐阅读