Arud
Arud

Reputation: 151

I am getting error like this Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe

What I trying to do here is getting data from the 000webhost.com and passing that to my model class. That model class is being passed to the provider. Now when I try to display the information in my screen i am getting error.

In this case i have a model class called StudentData.

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

  StudentData({
    this.rollNumber,
    this.firstName,
    this.lastName,
  });
}

Here I am fetching data using http package from internet. And passing the decoded data to the StudentData class and passing that to my data_provider

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);
}

Here is my DataProvider

class DataProvider extends ChangeNotifier {

  StudentData myStudentData;

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

After that I have tried to fetch those information in my Screen

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

Then the error be like

======== 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): 

This is my main class and i am using multiprovider here.



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(),
          ),
        );
      
  }
}

This is where I call getStudentData function

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'[email protected]$'));

      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(){}');
    }
  }

Upvotes: 1

Views: 158

Answers (1)

hasan karaman
hasan karaman

Reputation: 1430

The HTTP request is sent to the provider listen: false because it can not listen. So that you can call the method. That's why I designed it from scratch for you. I hope you understand. It will probably work if you do it as I did.

 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),
               ),
              ),
             );
             }
            }

Upvotes: 1

Related Questions