Flutter 我遇到了这样一个未处理的异常:查找一个停用的小部件';他的祖先是不安全的

Flutter 我遇到了这样一个未处理的异常:查找一个停用的小部件';他的祖先是不安全的,flutter,dart,provider,Flutter,Dart,Provider,我在这里试图做的是从000webhost.com获取数据并将其传递给我的模型类。该模型类正在传递给提供程序。现在,当我试图在屏幕上显示信息时,我发现了一个错误 在本例中,我有一个名为StudentData的模型类 class StudentData { final String rollNumber; final String firstName; final String lastName; StudentData({ this.rollNumber, thi

我在这里试图做的是从000webhost.com获取数据并将其传递给我的模型类。该模型类正在传递给提供程序。现在,当我试图在屏幕上显示信息时,我发现了一个错误

在本例中,我有一个名为StudentData的模型类

class StudentData {
  final String rollNumber;
  final String firstName;
  final String lastName;

  StudentData({
    this.rollNumber,
    this.firstName,
    this.lastName,
  });
}
这里我使用http包从internet获取数据。 将解码后的数据传递给StudentData类,并将其传递给我的数据提供者

import 'package:http/http.dart' as http;

void getStudentData(String currentEmail, BuildContext context) async {
  final _url = 'https://aaa.000webhostapp.com/getStudentData.php';
  final response = await http.post(_url, body: {'email': currentEmail});
  var data = response.body;

  final decodedData = jsonDecode(data);
  final myRollNumber = decodedData['roll_number'];
  final myFirstName = decodedData['first_name'];
  final myLastName = decodedData['last_name'];

  final myStudentData = StudentData(
      rollNumber: myRollNumber, firstName: myFirstName, lastName: myLastName);

  Provider.of<DataProvider>(context, listen: false)
      .getMyStudentData(myStudentData);
}
之后,我尝试在屏幕上获取这些信息

class StudentDashboard extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
       
        body: Center(
          child:
              Text(Provider.of<DataProvider>(context).myStudentData.rollNumber),
        ),
      ),
    );
  }
}

HTTP请求被发送到提供程序listen:false,因为它无法侦听。以便您可以调用该方法。这就是我为你从头开始设计的原因。我希望你能理解。如果你像我那样做,它可能会起作用

 import 'package:http/http.dart' as http;

 Future<StudentData> _getStudentData(String currentEmail, BuildContext context)async {
    final _url = 'https://aaa.000webhostapp.com/getStudentData.php';
    final response = await http.post(_url, body: {'email': currentEmail});
    var data = response.body;
    if (data.isEmpty) return null;

   final decodedData = jsonDecode(data);
   final myRollNumber = decodedData['roll_number'];
   final myFirstName = decodedData['first_name'];
   final myLastName = decodedData['last_name'];

    final myStudentData = StudentData(
    rollNumber: myRollNumber, firstName: myFirstName, lastName: myLastName);

    return MystudentData;
  }

class StudentDashboard扩展了无状态小部件{
@凌驾
void initState(){
super.initState();getRequest();
}
future getRequest()异步{
Provider.of(上下文,侦听:false)
.getMyStudentDataAsync();
}
@凌驾
小部件构建(构建上下文){
数据提供者_DataProvider=Provider.of(上下文);
返回安全区(
孩子:脚手架(
正文:中(
儿童:
文本(_dataProvider.myStudentData.rollNumber),
),
),
);
}
}

您在哪里调用getStudentData?myStudentData为空,这是导致问题的原因,因此我认为数据未被提取。我在登录时调用了getStudentData函数,并且能够从internet提取这些数据。当我想在屏幕上显示这些数据时,会弹出错误。你能分享登录屏幕代码吗?当然。我已更新代码。请尝试等待getStudentData(电子邮件、上下文);在按下学生仪表板之前。getStudentData是异步的,http.post需要一些时间才能执行。我猜您的页面正在尝试在获取卷号之前访问卷号。
======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building StudentDashboard(dirty, dependencies: [_InheritedProviderScope<DataProvider>]):
The getter 'rollNumber' was called on null.
Receiver: null
Tried calling: rollNumber

The relevant error-causing widget was: 
  StudentDashboard file:///D:/Other/App/Flutter/my_ecampus/lib/views/screens/auth_screens/login_screen.dart:62:53
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      StudentDashboard.build (package:my_ecampus/views/screens/main_screens/student_screens/student_dashboard.dart:38:69)
#2      StatelessElement.build (package:flutter/src/widgets/framework.dart:4701:28)
#3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
#4      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
...
====================================================================================================
E/flutter ( 7682): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter ( 7682): At this point the state of the widget's element tree is no longer stable.
E/flutter ( 7682): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
E/flutter ( 7682): #0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3906:9)
E/flutter ( 7682): #1      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3920:6)
E/flutter ( 7682): #2      Element.getElementForInheritedWidgetOfExactType (package:flutter/src/widgets/framework.dart:3986:12)
E/flutter ( 7682): #3      Provider._inheritedElementOf (package:provider/src/provider.dart:324:34)
E/flutter ( 7682): #4      Provider.of (package:provider/src/provider.dart:281:30)
E/flutter ( 7682): #5      getStudentData (package:my_ecampus/business_view/services/database/getData_database.dart:19:12)
E/flutter ( 7682): <asynchronous suspension>
E/flutter ( 7682): #6      LoginScreen._login (package:my_ecampus/views/screens/auth_screens/login_screen.dart:60:9)
E/flutter ( 7682): <asynchronous suspension>
E/flutter ( 7682): #7      LoginScreen.build.<anonymous closure>.<anonymous closure> (package:my_ecampus/views/screens/auth_screens/login_screen.dart:198:31)
E/flutter ( 7682): #8      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:993:19)
E/flutter ( 7682): #9      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1111:38)
E/flutter ( 7682): #10     GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:183:24)
E/flutter ( 7682): #11     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:598:11)
E/flutter ( 7682): #12     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:287:5)
E/flutter ( 7682): #13     BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:259:7)
E/flutter ( 7682): #14     GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27)
E/flutter ( 7682): #15     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:362:20)
E/flutter ( 7682): #16     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:338:22)
E/flutter ( 7682): #17     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:267:11)
E/flutter ( 7682): #18     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:295:7)
E/flutter ( 7682): #19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:240:7)
E/flutter ( 7682): #20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:213:7)
E/flutter ( 7682): #21     _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 7682): #22     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 7682): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 7682): #24     _invoke1 (dart:ui/hooks.dart:265:10)
E/flutter ( 7682): #25     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)
E/flutter ( 7682): 



void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
        return MultiProvider(
          providers: [
            ChangeNotifierProvider<WidgetProvider>(
                create: (context) => WidgetProvider()),
            ChangeNotifierProvider<DataProvider>(
                create: (context) => DataProvider()),
          ],
          child: MaterialApp(
            home: LoginScreen(),
          ),
        );
      
  }
}

void _login({String email, String password, BuildContext context}) async {
    
    final loginResponse =
        await loginDatabase(email: email, password: password, context: context);
    if (loginResponse.isNotEmpty) {

      final isStaff = email.contains(RegExp(r'.ce@srit.org$'));

      if (isStaff == true) {
        getStaffData(email, context);
        Navigator.pushReplacement(
            context, MaterialPageRoute(builder: (context) => StaffDashboard()));
      } else {

        getStudentData(email, context);//here is the getStudentData() function

        Navigator.pushReplacement(context,
            MaterialPageRoute(builder: (context) => StudentDashboard()));
      }
    } else {
      print('Login Failed from loginDatabase(){}');
    }
  }
 import 'package:http/http.dart' as http;

 Future<StudentData> _getStudentData(String currentEmail, BuildContext context)async {
    final _url = 'https://aaa.000webhostapp.com/getStudentData.php';
    final response = await http.post(_url, body: {'email': currentEmail});
    var data = response.body;
    if (data.isEmpty) return null;

   final decodedData = jsonDecode(data);
   final myRollNumber = decodedData['roll_number'];
   final myFirstName = decodedData['first_name'];
   final myLastName = decodedData['last_name'];

    final myStudentData = StudentData(
    rollNumber: myRollNumber, firstName: myFirstName, lastName: myLastName);

    return MystudentData;
  }
  class DataProvider extends ChangeNotifier {

  StudentData myStudentData;

  void getMyStudentData(StudentData studentData) {
      myStudentData = studentData;
      notifyListeners();
     }
   }

 Future getMyStudentDataAsync() async {
      StudentData result = await _getStudentData();
       getMyStudentData(result);
   }
   class StudentDashboard extends StatelessWidget {

         @override
      void initState() {
       super.initState(); getRequest();
   }
   future  getRequest()async{
    Provider.of<DataProvider>(context, listen: false)
     .getMyStudentDataAsync();
       }
        
       @override
     Widget build(BuildContext context) {
    DataProvider _dataProvider = Provider.of<DataProvider>(context);
        return SafeArea(
             child: Scaffold(
   
            body: Center(
            child:
            Text( _dataProvider.myStudentData.rollNumber),
               ),
              ),
             );
             }
            }