简体   繁体   中英

Flutter Dismissible widget with confirmDismiss and showAlertDialog stop app

When I try to use confirmDismiss on Dismissible widget with showAlertDialog, it pops up alert but, also throws exception and stop app. If I try to continue after exception, it works normal.

Maybe similar to this question I've tried showAlertDialog to separate function and different type of calling navigation, but non of them solve it.

            Dismissible(
              confirmDismiss: (direction) {
                return showDialog(
                  context: context,
                  builder: (context) {
                    return CupertinoAlertDialog(
                      title: Text('Delete'),
                      content: Text('Delete'),
                      actions: <Widget>[
                        FlatButton(
                          onPressed: () {
                            // Navigator.pop(context, false);
                            Navigator.of(
                              context,
                              // rootNavigator: true,
                            ).pop(false);
                          },
                          child: Text('No'),
                        ),
                        FlatButton(
                          onPressed: () {
                            // Navigator.pop(context, true);
                            Navigator.of(
                              context,
                              // rootNavigator: true,
                            ).pop(true);
                          },
                          child: Text('Yes'),
                        ),
                      ],
                    );
                  },
                );
              },
              key: Key(UniqueKey().toString()),
              direction: DismissDirection.endToStart,
              onDismissed: (direction) {
                //TODO DELETE
                Scaffold.of(context).showSnackBar(
                  SnackBar(
                    backgroundColor: Theme.of(context).accentColor,
                    content: Text(
                      'test',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20.0,
                        color: Colors.white,
                      ),
                    ),
                  ),
                );
              },
              background: Container(
                padding: const EdgeInsets.only(right: 20.0),
                // alignment: AlignmentDirectional.centerEnd,
                alignment: Alignment.centerRight,
                color: Theme.of(context).accentColor,
                child: Icon(
                  Icons.delete,
                  size: 32.0,
                  color: Theme.of(context).primaryColor,
                ),
              ),
              child: Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20.0),
                child: CartCard(),
              ),
            ),

this is exception

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: 'package:flutter/src/animation/animation_controller.dart': Failed assertion: line 484 pos 7: '_ticker != null': AnimationController.reverse() called after AnimationController.dispose()
AnimationController methods should not be used after calling dispose.
#0      _AssertionError._doThrowNew  (dart:core-patch/errors_patch.dart:40:39)
#1      _AssertionError._throwNew  (dart:core-patch/errors_patch.dart:36:5)
#2      AnimationController.reverse 
package:flutter/…/animation/animation_controller.dart:484
#3      _DismissibleState._handleDismissStatusChanged 
package:flutter/…/widgets/dismissible.dart:449
<asynchronous suspension>
#4      AnimationLocalStatusListenersMixin.notifyStatusListeners 
package:flutter/…/animation/listener_helpers.dart:193
#5      AnimationController._checkStatusChanged 
package:flutter/…/animation/animation_controller.dart:753
#6      AnimationController._tick (package:flutter/src/animation/animation_contr<…>

Your problem is not with the dismiss or confirm dismiss method. The error warning is clear: Your issue is with the Animation Controller.

Apparently, somewhere in your code, you are disposing of it - most likely in the:

 @override dispose 

Try to remove it and see if it works.

OK try this

        Dismissible(
          confirmDismiss: (direction) {
            return showDialog(
              context: context,
              builder: (context) {
                return CupertinoAlertDialog(
                  title: Text('Delete'),
                  content: Text('Delete'),
                  actions: <Widget>[
                    FlatButton(
                      onPressed: () {
                        // Navigator.pop(context, false);
                        Navigator.of(
                          context,
                          // rootNavigator: true,
                        ).pop(false);
                      },
                      child: Text('No'),
                    ),
                    FlatButton(
                      onPressed: () {
                        // Navigator.pop(context, true);
                        Navigator.of(
                          context,
                          // rootNavigator: true,
                        ).pop(true);
                      },
                      child: Text('Yes'),
                    ),
                  ],
                );
              },
            );
          },
          key: UniqueKey(),
          direction: DismissDirection.endToStart,
          onDismissed: (direction) {
            //TODO DELETE
            Scaffold.of(context).showSnackBar(
              SnackBar(
                backgroundColor: Theme.of(context).accentColor,
                content: Text(
                  'test',
                  textAlign: TextAlign.center,
                  style: TextStyle(
                    fontSize: 20.0,
                    color: Colors.white,
                  ),
                ),
              ),
            );
          },
          background: Container(
            padding: const EdgeInsets.only(right: 20.0),
            // alignment: AlignmentDirectional.centerEnd,
            alignment: Alignment.centerRight,
            color: Theme.of(context).accentColor,
            child: Icon(
              Icons.delete,
              size: 32.0,
              color: Theme.of(context).primaryColor,
            ),
          ),
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20.0),
            child: CartCard(),
          ),
        ),

all you need to do is write a function for example

Future<bool> sample(DismissDirection direction) async{
   #write you code
   return true or false;
}

it's work for me

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM