0

I am working on an application (something like a quiz app to do some calculations). For each screen I have a controller and one of these screens is the result screen. Everything works fine in the first attempt, however, in the second attempt, when I finish the quiz, The results screen returns null and says that "null check operator used on a null value.

this is the thrown exception


════════ Exception caught by widgets library ═══════════════════════════════════
The following _CastError was thrown building _BodyBuilder:
Null check operator used on a null value

The relevant error-causing widget was
Scaffold
lib/…/view/result_screen.dart:27
When the exception was thrown, this was the stack
#0      GetBuilderState.initState
package:get/…/simple/get_state.dart:134
#1      StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:4770
#2      ComponentElement.mount
package:flutter/…/widgets/framework.dart:4605
...     Normal element mounting (19 frames)
#21     Element.inflateWidget
package:flutter/…/widgets/framework.dart:3662
#22     MultiChildRenderObjectElement.inflateWidget
package:flutter/…/widgets/framework.dart:6285
#23     MultiChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:6296
...     Normal element mounting (111 frames)
#134    Element.inflateWidget
package:flutter/…/widgets/framework.dart:3662
#135    MultiChildRenderObjectElement.inflateWidget
package:flutter/…/widgets/framework.dart:6285
#136    MultiChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:6296
...     Normal element mounting (9 frames)
#145    Element.inflateWidget
package:flutter/…/widgets/framework.dart:3662
#146    MultiChildRenderObjectElement.inflateWidget
package:flutter/…/widgets/framework.dart:6285
#147    MultiChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:6296
...     Normal element mounting (170 frames)
#317    Element.inflateWidget
package:flutter/…/widgets/framework.dart:3662
#318    MultiChildRenderObjectElement.inflateWidget
package:flutter/…/widgets/framework.dart:6285
#319    Element.updateChild
package:flutter/…/widgets/framework.dart:3414
#320    RenderObjectElement.updateChildren
package:flutter/…/widgets/framework.dart:5717
#321    MultiChildRenderObjectElement.update
package:flutter/…/widgets/framework.dart:6308
#322    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#323    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#324    StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4805
#325    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#326    StatefulElement.update
package:flutter/…/widgets/framework.dart:4837
#327    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#328    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#329    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#330    ProxyElement.update
package:flutter/…/widgets/framework.dart:4985
#331    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#332    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#333    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#334    ProxyElement.update
package:flutter/…/widgets/framework.dart:4985
#335    _InheritedNotifierElement.update
package:flutter/…/widgets/inherited_notifier.dart:181
#336    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#337    SingleChildRenderObjectElement.update
package:flutter/…/widgets/framework.dart:6154
#338    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#339    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#340    StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4805
#341    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#342    StatefulElement.update
package:flutter/…/widgets/framework.dart:4837
#343    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#344    SingleChildRenderObjectElement.update
package:flutter/…/widgets/framework.dart:6154
#345    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#346    SingleChildRenderObjectElement.update
package:flutter/…/widgets/framework.dart:6154
#347    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#348    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#349    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#350    ProxyElement.update
package:flutter/…/widgets/framework.dart:4985
#351    Element.updateChild
package:flutter/…/widgets/framework.dart:3401
#352    ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4657
#353    StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4805
#354    Element.rebuild
package:flutter/…/widgets/framework.dart:4322
#355    BuildOwner.buildScope
package:flutter/…/widgets/framework.dart:2619
#356    WidgetsBinding.drawFrame
package:flutter/…/widgets/binding.dart:878
#357    RendererBinding._han
#358    SchedulerBinding._invokeFrameCallback
package:flutter/…/scheduler/binding.dart:1143
#359    SchedulerBinding.handleDrawFrame
package:flutter/…/scheduler/binding.dart:1080
#360    SchedulerBinding._handleDrawFrame
package:flutter/…/scheduler/binding.dart:996
#364    _invoke (dart:ui/hooks.dart:163:10)
#365    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:259:5)
#366    _drawFrame (dart:ui/hooks.dart:126:31)
(elided 3 frames from dart:async)

when I clicked on ( lib/…/view/result_screen.dart:27 ) in the error stack it took me to the scaffold of the screen. I am not sure why this is happening.

I have a HomeWrapper screen that consists of some widgets and a page view


void initControllers() {
    Get.put(HomeScreenController());
    Get.put(FirstPageController());
    Get.put(SecondPageController());
    Get.put(ThirdPageController());
    Get.put(FourthPageController());
    Get.put(FifthPageController());
    Get.put(SixthPageController());
    Get.put(SeventhPageController());
    Get.put(EighthPageController());
    Get.put(ResultsController());
  }

  @override
  Widget build(BuildContext context) {
    initControllers();
  return Column(...);

}

in the eighth page, there is a button that executes a method to caluculate the result and navigate to the results screen

class FinishButton extends StatelessWidget {
  final bool _isValid = Get.find<FirstPageController>().validLandArea;
  @override
  Widget build(BuildContext context) {
    return GetBuilder<ResultsController>(
      builder: (controller) => Padding(
        padding: const EdgeInsets.only(bottom: 20.0),
        child: CupertinoButton(
          child: Text('Finish'),
          onPressed: () {
            if (_isValid) {
              controller.clickFinishButton();
              Navigator.pushReplacementNamed(context, ResultScreen.id);
            } else {
              HomeScreenController.to.goToLandArea();
            }
          },
          color: AppColors.primaryColor,
        ),
      ),
    );
  }
}

in the results page, there is a button to take me back to the Root that will return either HomeWrapper or Authetication based on user value (whether he's logged in or not)

CupertinoButton(
                        child: Text('Back to Home'),
                        onPressed: () {
                          Navigator.pushReplacementNamed(context, Root.id);
                        },
                        color: AppColors.primaryColor,
                      ),

when I get back to HomeWrapper all pages are working fine with their controllers except when I navigate back to the result screen.

I tried to make the controller permenant and lazy put but did not work. If someone please can tell me what the problem is.

Ali Alqallaf
  • 789
  • 9
  • 24
  • Try sharing your actual code and not just the error. In particular how you're initializing the controller and how you're navigating back to the page when you get the error. – Loren.A Jun 29 '21 at 12:03
  • I have updated the question – Ali Alqallaf Jun 29 '21 at 12:16
  • Are you using `GetMaterialApp` or `MaterialApp`? And are you seeing `[GETX]` logs of controllers being deleted when you navigate? You can try `pushNamed` instead of `pushReplacementNamed` when you route to the results screen. – Loren.A Jun 29 '21 at 13:19
  • Yes I am using GetMaterialApp and I see all the getx logs. I just managed to solve the problem. Apparently, it was because of my PdfService controller (to save the result and share it) that i initialize using lazyPut in the main. I used "put" and it works just fine now but I have no Idea why. Can you please explain why this is happening if you got an idea? – Ali Alqallaf Jun 29 '21 at 13:26
  • I'm pretty sure if you set the `fenix` property to `true` with lazyPut that also would have worked because it will return the same instance after being deleted. I suggest reading on the docs here https://github.com/jonataslaw/getx/blob/master/documentation/en_US/dependency_management.md#instancing-methods to have a better understanding of the different init methods. – Loren.A Jun 29 '21 at 13:36

0 Answers0