getx icon indicating copy to clipboard operation
getx copied to clipboard

Null check operator used on a null value

Open LvJson opened this issue 7 months ago • 2 comments

Describe the bug When i use Get.back(),it will throw exception,but when i use Phone physical return button ,it's great.

The following _TypeError was thrown during paint(): Null check operator used on a null value

The relevant error-causing widget was: TabBar TabBar:file:///Users/mac/Documents/jiachao/flutter_jiachao/jc_agg/lib/pages/test_page/test_view.dart:26:11 When the exception was thrown, this was the stack: #0 _IndicatorPainter.paint (package:flutter/src/material/tabs.dart:532:46) #1 RenderCustomPaint._paintWithPainter (package:flutter/src/rendering/custom_paint.dart:588:13) #2 RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:630:7) #3 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #4 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #5 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2882:15) #6 RenderFlex.paint (package:flutter/src/rendering/flex.dart:1040:7) #7 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #8 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #9 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2882:15) #10 RenderCustomMultiChildLayoutBox.paint (package:flutter/src/rendering/custom_layout.dart:408:5) #11 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #12 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #13 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:129:13) #14 _RenderInkFeatures.paint (package:flutter/src/material/material.dart:662:11) #15 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #16 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #17 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:129:13) #18 RenderPhysicalModel.paint. (package:flutter/src/rendering/proxy_box.dart:2043:15) #19 PaintingContext.pushClipRRect (package:flutter/src/rendering/object.dart:575:14) #20 RenderPhysicalModel.paint (package:flutter/src/rendering/proxy_box.dart:2030:21) #21 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #22 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #23 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:129:13) #24 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #25 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:250:13) #26 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:129:13) #27 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:3208:7) #28 PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:166:11) #29 PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:109:5) #30 PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:1156:31) #31 PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:1166:15) #32 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:593:23) #33 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:986:13) #34 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:457:5) #35 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1325:15) #36 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1255:9) #37 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1113:5) #38 _invoke (dart:ui/hooks.dart:312:13) #39 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:383:5) #40 _drawFrame (dart:ui/hooks.dart:283:31) The following RenderObject was being processed when the exception was fired: RenderCustomPaint#6ebc9 relayoutBoundary=up2 ... parentData: offset=Offset(0.0, 0.0); flex=null; fit=null (can use size) ... constraints: BoxConstraints(0.0<=w<=360.0, 0.0<=h<=Infinity) ... size: Size(360.0, 48.0) ... painter: _IndicatorPainter#c8faf(AnimationController#54b98(▶ 0.000; paused; DISPOSED)) RenderObject: RenderCustomPaint#6ebc9 relayoutBoundary=up2 parentData: offset=Offset(0.0, 0.0); flex=null; fit=null (can use size) constraints: BoxConstraints(0.0<=w<=360.0, 0.0<=h<=Infinity) size: Size(360.0, 48.0) painter: _IndicatorPainter#c8faf(AnimationController#54b98(▶ 0.000; paused; DISPOSED)) ... child: _TabLabelBarRenderer#47174 relayoutBoundary=up3 ... parentData: (can use size) ... constraints: BoxConstraints(0.0<=w<=360.0, 0.0<=h<=Infinity) ... size: Size(360.0, 48.0) ... direction: horizontal ... mainAxisAlignment: start ... mainAxisSize: max ... crossAxisAlignment: center ... textDirection: ltr ... verticalDirection: down ... child 1: RenderSemanticsAnnotations#19000 relayoutBoundary=up4 ... parentData: offset=Offset(0.0, 0.0); flex=1; fit=FlexFit.tight (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0) ... child: RenderMouseRegion#14487 relayoutBoundary=up5 ... parentData: (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0) ... behavior: opaque ... listeners: enter, exit ... cursor: SystemMouseCursor(click) ... child: RenderSemanticsAnnotations#3eabf relayoutBoundary=up6 ... parentData: (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0) ... child 2: RenderSemanticsAnnotations#d151c relayoutBoundary=up4 ... parentData: offset=Offset(180.0, 0.0); flex=1; fit=FlexFit.tight (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0) ... child: RenderMouseRegion#cf691 relayoutBoundary=up5 ... parentData: (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0) ... behavior: opaque ... listeners: enter, exit ... cursor: SystemMouseCursor(click) ... child: RenderSemanticsAnnotations#034cf relayoutBoundary=up6 ... parentData: (can use size) ... constraints: BoxConstraints(w=180.0, 0.0<=h<=Infinity) ... size: Size(180.0, 48.0)

Reproduction code NOTE: THIS IS MANDATORY, IF YOUR ISSUE DOES NOT CONTAIN IT, IT WILL BE CLOSED PRELIMINARY)

example:


class TestState {
  late TabController controller;

  TestState() {
    ///Initialize variables
  }
}

class TestLogic extends GetxController with GetSingleTickerProviderStateMixin {
  final TestState state = TestState();

  @override
  void onInit() {
    super.onInit();
    state.controller = TabController(length: 2, vsync: this);
  }

  @override
  void onReady() {
    super.onReady();
  }

  @override
  void onClose() {
    state.controller.dispose();
    super.onClose();
  }
}


class TestPage extends StatelessWidget {
  TestPage({Key? key}) : super(key: key);
  final logic = Get.put(TestLogic());
  final state = Get.find<TestLogic>().state;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Test"),
        actions: [
          TextButton(
              onPressed: () {
                Get.back();
              },
              child: Text("Go Back"))
        ],
      ),
      body: Column(
        children: [
          TabBar(controller: state.controller, tabs: [
            Tab(
              text: "123",
            ),
            Tab(
              text: "456",
            )
          ]),
          Expanded(
              child: TabBarView(controller: state.controller, children: [
            Container(
              color: Colors.red,
            ),
            Container(
              color: Colors.green,
            )
          ]))
        ],
      ),
    );
  }
}

To Reproduce Steps to reproduce the behavior:

  1. click the textButton "Go Back" will throw exception.

Flutter Version: Enter the version of the Flutter you are using [✓] Flutter (Channel stable, 3.16.4, on macOS 12.7.2 21G1974 darwin-x64, locale zh-Hans-CN) [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2) [✓] Xcode - develop for iOS and macOS (Xcode 14.0) [✓] Chrome - develop for the web [✓] Android Studio (version 2023.1) [✓] Connected device (3 available)

Getx Version: get: ^4.6.6

LvJson avatar Jan 19 '24 05:01 LvJson

I found the reason for the error.

If i set navigatorObservers,it will throw exception.

GetMaterialApp(
              navigatorObservers: [
                GetXRouterObserver()
              ],
            )


class GetXRouterObserver extends NavigatorObserver {
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    RouterReportManager.reportCurrentRoute(route);
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) async {
    RouterReportManager.reportRouteDispose(route);
  }
}

LvJson avatar Jan 19 '24 07:01 LvJson

I found the reason for the error.

If i set navigatorObservers,it will throw exception.

GetMaterialApp(
              navigatorObservers: [
                GetXRouterObserver()
              ],
            )


class GetXRouterObserver extends NavigatorObserver {
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    RouterReportManager.reportCurrentRoute(route);
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) async {
    RouterReportManager.reportRouteDispose(route);
  }
}

有办法在不移除这个observer的情况下解决这个bug吗?

我这边有个问题:我想在路由之前判断用户是否登录,如果没登录我路由就不跳转,但是中间件必须要返回一个RoutSetting,因此我想着监听路由跳转,加了observer,但是碰到跟你一样 的报错。

YeFei572 avatar Feb 06 '24 05:02 YeFei572