-2

I had a problem from Getting EXCEPTION CAUGHT BY WIDGETS LIBRARY & Failed assertion: line 3289 pos 12: '!_debugLocked': is not true So i decided to recreated the issue, When the increment _counter is more than 2 it would go to Home() But an error would pop up

import 'dart:async';
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new Greeting(),
  ));
}

class Greeting extends StatefulWidget {
  @override
  _GreetingState createState() => new _GreetingState();
}

class _GreetingState extends State<Greeting> {
  @override
  initState() {
    super.initState();
  }

  static int _counter = 0;

  void _increment() {
    setState(() {
      _counter++;
    });
  }



  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Align(
          alignment: FractionalOffset.center,
          child: new Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[

              RaisedButton(
                onPressed: _increment,
                child: Text('Increment'),
              ),
              Text('Count: $_counter'),


              RaisedButton(                      // Current Testing swap Page
                child: Text('Go to home test'),
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => Home()),
                  );
                },
              ),

              (_counter > 2) == true ?
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => Home()),
              ):Container()


            ],
          )),
    );
  }

}




class Home extends StatefulWidget {
  @override
  _HomeState createState() => new _HomeState();
}

class _HomeState extends State<Home> {

  initState() {
    super.initState();
    new Timer(const Duration(seconds: 5), onClose);
  }

  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        backgroundColor: Colors.pink,
        title: new Text("Home"),
      ),
    );
  }

  void onClose() {
    Navigator.pop(context);
  }
}

Is there any reason why i can't use the condition to navigate to another page?

Launching lib\main.dart on Android SDK built for x86 in debug mode...
Running Gradle task 'assembleDebug'...
√ Built build\app\outputs\apk\debug\app-debug.apk.
Installing build\app\outputs\apk\app.apk...
Debug service listening on ws://127.0.0.1:52775/UyFpSA2pizE=/ws
Syncing files to device Android SDK built for x86...
D/EGL_emulation( 6595): eglMakeCurrent: 0xdc91a2a0: ver 3 1 (tinfo 0xdc90f7d0)

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building Greeting(dirty, state: _GreetingState#11d1e):
setState() or markNeedsBuild() called during build.

This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets.  A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was: Overlay-[LabeledGlobalKey<OverlayState>#5fa74]
  state: OverlayState#b1e52(entries: [OverlayEntry#629a0(opaque: true; maintainState: false), OverlayEntry#de9e6(opaque: false; maintainState: true), OverlayEntry#60d55(opaque: false; maintainState: false), OverlayEntry#09442(opaque: false; maintainState: true)])
The widget which was currently being built when the offending call was made was: Greeting
  dirty
  state: _GreetingState#11d1e
The relevant error-causing widget was: 
  Greeting file:///C:/Users/18049496/AndroidStudioProjects/new_page/lib/main.dart:6:15
When the exception was thrown, this was the stack: 
#0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4167:11)
#1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4182:6)
#2      State.setState (package:flutter/src/widgets/framework.dart:1253:14)
#3      OverlayState.rearrange (package:flutter/src/widgets/overlay.dart:415:5)
#4      NavigatorState._flushHistoryUpdates (package:flutter/src/widgets/navigator.dart:3069:16)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
E/flutter ( 6595): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2334 pos 18: '!navigator._debugLocked': is not true.
E/flutter ( 6595): #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
E/flutter ( 6595): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
E/flutter ( 6595): #2      _RouteEntry.handlePush.<anonymous closure> (package:flutter/src/widgets/navigator.dart:2334:18)
E/flutter ( 6595): #3      TickerFuture.whenCompleteOrCancel.thunk (package:flutter/src/scheduler/ticker.dart:398:15)
E/flutter ( 6595): #4      _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter ( 6595): #5      _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6595): #6      _FutureListener.handleValue (dart:async/future_impl.dart:141:18)
E/flutter ( 6595): #7      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:682:45)
E/flutter ( 6595): #8      Future._propagateToListeners (dart:async/future_impl.dart:711:32)
E/flutter ( 6595): #9      Future._completeWithValue (dart:async/future_impl.dart:526:5)
E/flutter ( 6595): #10     Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:556:7)
E/flutter ( 6595): #11     _rootRun (dart:async/zone.dart:1184:13)
E/flutter ( 6595): #12     _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter ( 6595): #13     _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter ( 6595): #14     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter ( 6595): #15     _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
E/flutter ( 6595): #16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
E/flutter ( 6595): 
E/flutter ( 6595): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3580 pos 12: '!_debugLocked': is not true.
E/flutter ( 6595): #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
E/flutter ( 6595): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
E/flutter ( 6595): #2      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:3580:12)
E/flutter ( 6595): #3      Navigator.pop (package:flutter/src/widgets/navigator.dart:2010:27)
E/flutter ( 6595): #4      _HomeState.onClose (package:newpage/main.dart:100:15)
E/flutter ( 6595): #5      _rootRun (dart:async/zone.dart:1180:38)
E/flutter ( 6595): #6      _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter ( 6595): #7      _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter ( 6595): #8      _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter ( 6595): #9      _rootRun (dart:async/zone.dart:1184:13)
E/flutter ( 6595): #10     _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter ( 6595): #11     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1003:23)
E/flutter ( 6595): #12     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:23:15)
E/flutter ( 6595): #13     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
E/flutter ( 6595): #14     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
E/flutter ( 6595): #15     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter ( 6595): 

Shappy
  • 21
  • 4

2 Answers2

0

I would suggest removing static int _counter = 0; and declare it outside the SetState like so int _counter = 0;

Zvi Karp
  • 3,621
  • 3
  • 25
  • 40
0

Add that navigator code into _increment function.

void _increment() {
setState(() {
  _counter++;
});
if (_counter > 2) {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => Home()),
  );
}
}
MSARKrish
  • 3,355
  • 4
  • 30
  • 43