Flutter - NoSuchMethodError: Получатель 'focusScopeNode' был вызван в нуль - PullRequest
1 голос
/ 18 января 2020

У меня возникает следующая ошибка при попытке передать List с одного экрана на другой. Данные передаются из функции async. Мне нужно открыть другой экран на основе данных, извлеченных из базы данных. Упомянутый ответ здесь не сработал для меня. вот ошибка.

: [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The 
getter 'focusScopeNode' was called on null.
E/flutter (26425): Receiver: null    
E/flutter (26425): Tried calling: focusScopeNode
E/flutter (26425): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter (26425): #1      Route.didPush.<anonymous closure> (package:flutter/src/widgets/navigator.dart:139:17)    

Код в асинхронном режиме c функция

 Navigator.push(context, MaterialPageRoute(builder: (context) {
    return ParentHome(childList);

Экран ParentHome

      class ParentHome extends StatefulWidget {
  List childDataList;

  ParentHome(this.childDataList);

  @override
  State<StatefulWidget> createState() {
    return ParentHomeWidget();
    }
   }
class ParentHomeWidget extends State<ParentHome> {
  @override
  Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
  home: Scaffold(
    body: Container(
      margin: EdgeInsets.all(5),
      child: ListView.builder(
          itemCount: widget.childDataList.length,
          itemBuilder: (BuildContext context, int index) => ListTile(
                title: Text(widget.childDataList[index]['title']),
              )),
    ),
      ),
    );
  }
}

Я не нахожу никакой помощи по этому поводу. Пожалуйста, помогите мне понять это. Я еще новичок ie во Флаттере. Спасибо

Выход Flutter Doctor

Flutter (стабильный канал, v1.12.13 + hotfix.5, на Linux, локаль en_US.UTF-8)
• Flutter версия 1.12.13 + hotfix.5 в /home/jamshaid/Documents/flutter_linux_v1.9.1+hotfix.4-stable/flutter
• Версия 27321ebbad (6 недель до go), 2019- 12-10 18:15:01 -0800 • Версия двигателя 2994f7e1e6
• Версия Dart 2.7.0
полная синхронизация c функция

Future<void> requestLogin(String userType) async {
/*
final response =
    await http.get('http://10.0.2.2/php_to_flutter/login_validation.php');*/
String databaseAddress = "";

switch (userType) {
  case "Student":
    databaseAddress = AppUtils.studentLoginLink;
    break;
  case "Parent":
    databaseAddress = AppUtils.parentLoginLink;

    break;
  case "Teacher":
    databaseAddress = AppUtils.teacherLoginLink;
    break;
}

    final response = await http
    .post(databaseAddress, body: {"email": email, "password": password});
String responseBody = response.body;

if (response.statusCode == 200) {
  switch (userType) {
    case "Student":
      print("Registration # $responseBody");
      break;
    case "Parent":
      List childList = responseBody.split(",");
      //child list needs to be separated by :
      /*Navigator.of(context).push(
          MaterialPageRoute(builder: (context) => ParentHome(childList)));
      */
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return ParentHome(childList);
      }));
      //Navigator.pop(context);

      print("Child List= $responseBody");
      break;
    case "Teacher":
      print("Teacher id= $responseBody");
      break;
  }
  form_key.currentState.reset();
  //dismissing progress dialog
  Navigator.pop(context);
  Toast.show("Login Successful", context,
      duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
 } else {
   Navigator.pop(context);
  print(databaseAddress);

  Toast.show("Error: " + response.statusCode.toString(), context,
      duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);

  print('error' + response.body);
  print(response.statusCode);
 }
 }

asyn c код вызывающего абонента Asyn c функция вызывается в onPressed из RaisedButton.

Widget studentLoginButton() {
    return RaisedButton(
      onPressed: () {
        if (form_key.currentState.validate()) {
          form_key.currentState.save();
          //  pr.show();
          AppUtils.showProgressDialog(context, "Loggin in...");
          requestLogin("Student");
          form_key.currentState.reset();

          //pr.dismiss();
        }

        // form_key.currentState.reset();
      },
      child: Text('S Login'),
      color: Colors.lightBlue,
    );
  }

1 Ответ

3 голосов
/ 18 января 2020

У вас есть еще Navigator.pop(context); после блока переключателей. Попробуйте также удалить это или установить default случай, если было намерение вернуться назад, если ни один из случаев не соответствует.

switch (userType) {
    case "Student":
      print("Registration # $responseBody");
      break;
    case "Parent":
      List childList = responseBody.split(",");
      //child list needs to be separated by :
      /*Navigator.of(context).push(
          MaterialPageRoute(builder: (context) => ParentHome(childList)));
      */
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return ParentHome(childList);
      }));
      //Navigator.pop(context);

      print("Child List= $responseBody");
      break;
    case "Teacher":
      print("Teacher id= $responseBody");
      break;
  }
  form_key.currentState.reset();
  //dismissing progress dialog
  //Navigator.pop(context);
  Toast.show("Login Successful", context,
      duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);

или

switch (userType) {
    case "Student":
      print("Registration # $responseBody");
      break;
    case "Parent":
      List childList = responseBody.split(",");
      //child list needs to be separated by :
      /*Navigator.of(context).push(
          MaterialPageRoute(builder: (context) => ParentHome(childList)));
      */
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return ParentHome(childList);
      }));
      //Navigator.pop(context);

      print("Child List= $responseBody");
      break;
    case "Teacher":
      print("Teacher id= $responseBody");
      break;
    default:
      form_key.currentState.reset();
      //dismissing progress dialog
      Navigator.pop(context);
      Toast.show("Login Successful", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }
...