【问题标题】:How to create custom reusable alert dialog in flutter如何在颤振中创建自定义可重用警报对话框
【发布时间】:2020-01-27 09:28:50
【问题描述】:

我对自定义警报对话框有疑问,我创建了一个自定义可重复使用的警报对话框,但是当我使用它时。不起作用。我的意思是按下事件不起作用。当我点击它时没有任何反应,所以请任何人检查我的代码并给我确切的解决方案。您的帮助将不胜感激:)

这是我尝试过的一些代码 :)

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:pin_code_fields/pin_code_fields.dart';
import 'package:tudo/src/styles/colors.dart';

class TudoDialogWidget extends StatefulWidget {
  const TudoDialogWidget({
    this.onPressed,
    this.title,
    this.height,
    this.width,
    this.alignment,
    this.padding,
    this.subText,
    this.hasTimerStopped,
    this.secondsremaining,
    this.timerfontsize,
    this.timercolor,
    this.timerfontWeight,
    this.passcode,
    this.ondone,
    this.onErrorcheck,
    this.hasError,
    this.buttontext,
    this.color,
    this.fontweight,
    this.fontsize,
  });
  final GestureTapCallback onPressed;
  final Widget title;
  final double height;
  final double width;
  final AlignmentGeometry alignment;
  final EdgeInsetsGeometry padding;
  final String subText;
  final bool hasTimerStopped;
  final int secondsremaining;
  final double timerfontsize;
  final Color timercolor;
  final FontWeight timerfontWeight;
  final String passcode;
  final ValueChanged<String> ondone;
  final ValueChanged<bool> onErrorcheck;
  final bool hasError;
  final String buttontext;
  final Color color;
  final FontWeight fontweight;
  final double fontsize;

  @override
  _TudoDialogWidgetState createState() => _TudoDialogWidgetState();
}

class _TudoDialogWidgetState extends State<TudoDialogWidget> {

  bool hasTimerStopped = false;
  String passcode;
  final changeNotifier = StreamController<Functions>.broadcast();
  bool hasError = false;
  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: widget.title ?? Text("Dialog Title"),
      content: SingleChildScrollView(
        child: ListBody(
          children: <Widget>[
            Container(
              height: widget.height ?? MediaQuery.of(context).size.height / 2.4,
              width: widget.width ?? MediaQuery.of(context).size.height,
              alignment: widget.alignment,
              child: ListView(
                children: <Widget>[
                  Padding(
                    padding: widget.padding ??
                        const EdgeInsets.symmetric(vertical: 8.0),
                    child: Text(
                      widget.subText ?? 'Enter Your Subtext Here!!',
                      style: TextStyle(
                          fontWeight: FontWeight.bold,
                          fontSize: 15,
                          color: Colors.black),
                      textAlign: TextAlign.center,
                    ),
                  ),
                  Center(
                    child: CountDownTimer(
                      secondsRemaining: widget.secondsremaining ?? 300,
                      whenTimeExpires: () {
                        setState(() {
                          hasTimerStopped = widget.hasTimerStopped;
                        });
                      },
                      countDownTimerStyle: TextStyle(
                        fontSize: widget.timerfontsize ?? 25,
                        color: widget.timercolor ?? Colors.amber,
                        fontWeight: widget.timerfontWeight ?? FontWeight.bold,
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(
                        vertical: 8.0, horizontal: 30),
                    child: PinCodeTextField(
                      length: 6, // must be greater than 0
                      obsecureText: false,
                      shape: PinCodeFieldShape.underline,
                      onDone: widget.ondone,
                      // onDone: (String value) {
                      //   setState(() {
                      //     passcode = value;
                      //     print(value);
                      //   });
                      // },

                      textStyle: TextStyle(
                          fontWeight: FontWeight
                              .bold), //optinal, default is TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold)
                      onErrorCheck: widget.onErrorcheck,
                      shouldTriggerFucntions:
                          changeNotifier.stream.asBroadcastStream(),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 30.0),
                    child: Text(
                      hasError
                          ? "*Please fill up all the cells and press VERIFY again"
                          : "",
                      style:
                          TextStyle(color: Colors.red.shade300, fontSize: 12),
                    ),
                  ),
                  SizedBox(
                    height: 5,
                  ),
                  RichText(
                    textAlign: TextAlign.center,
                    text: TextSpan(
                        text: "Didn't receive the code? ",
                        style: TextStyle(color: Colors.black54, fontSize: 15),
                        children: [
                          TextSpan(
                              text: " RESEND",
                              // recognizer: onTapRecognizer,
                              style: TextStyle(
                                  color: widget.color,
                                  fontWeight:
                                      widget.fontweight ?? FontWeight.bold,
                                  fontSize: widget.fontsize ?? 16))
                        ]),
                  ),
                  SizedBox(
                    height: 7,
                  ),
                  Container(
                    margin: const EdgeInsets.symmetric(
                        vertical: 16.0, horizontal: 30),
                    child: ButtonTheme(
                      height: 50,
                      child: FlatButton(
                        onPressed: widget.onPressed,
                        child: Center(
                            child: Text(
                          widget.buttontext ?? "VERIFY".toUpperCase(),
                          style: TextStyle(
                              color: Colors.white,
                              fontSize: 18,
                              fontWeight: FontWeight.bold),
                        )),
                      ),
                    ),
                    decoration: BoxDecoration(
                      color: widget.color ?? colorStyles["primary"],
                      borderRadius: BorderRadius.circular(5),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
      actions: <Widget>[
        FlatButton(
          child: Text('Close'),
          onPressed: () {
            Navigator.of(context).pop();
          },
        ),
      ],
    );
  }
}

class CountDownTimer extends StatefulWidget {
  const CountDownTimer({
    Key key,
    int secondsRemaining,
    this.countDownTimerStyle,
    this.whenTimeExpires,
    this.countDownFormatter,
  })  : secondsRemaining = secondsRemaining,
        super(key: key);

  final int secondsRemaining;
  final Function whenTimeExpires;
  final Function countDownFormatter;
  final TextStyle countDownTimerStyle;

  State createState() => new _CountDownTimerState();
}

class _CountDownTimerState extends State<CountDownTimer>
    with TickerProviderStateMixin {
  AnimationController _controller;
  Duration duration;
  String formatHHMMSS(int seconds) {
    int hours = (seconds / 3600).truncate();
    seconds = (seconds % 3600).truncate();
    int minutes = (seconds / 60).truncate();

    String hoursStr = (hours).toString().padLeft(2, '0');
    String minutesStr = (minutes).toString().padLeft(2, '0');
    String secondsStr = (seconds % 60).toString().padLeft(2, '0');

    if (hours == 0) {
      return "$minutesStr:$secondsStr";
    }

    return "$hoursStr:$minutesStr:$secondsStr";
  }

  String get timerDisplayString {
    Duration duration = _controller.duration * _controller.value;
    return widget.countDownFormatter != null
        ? widget.countDownFormatter(duration.inSeconds)
        : formatHHMMSS(duration.inSeconds);
    // In case user doesn't provide formatter use the default one
    // for that create a method which will be called formatHHMMSS or whatever you like
  }

  @override
  void initState() {
    super.initState();
    duration = new Duration(seconds: widget.secondsRemaining);
    _controller = new AnimationController(
      vsync: this,
      duration: duration,
    );
    _controller.reverse(from: widget.secondsRemaining.toDouble());
    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed ||
          status == AnimationStatus.dismissed) {
        widget.whenTimeExpires();
      }
    });
  }

  @override
  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return new Center(
        child: AnimatedBuilder(
            animation: _controller,
            builder: (_, Widget child) {
              return Text(
                timerDisplayString,
                style: widget.countDownTimerStyle,
              );
            }));
  }
}

【问题讨论】:

    标签: flutter popup flutter-layout customdialog flutter-alertdialog


    【解决方案1】:

    您的代码运行良好。你可以看到图片,显示文字作品。
    您需要显示您的 Tudo 对话框,如下面的代码 sn-p
    对于您通过的 onPress 事件,需要进一步澄清

     _showCustomDialog(BuildContext context) {
      showDialog(
          context: context,
          builder: (context) {
            return TudoDialogWidget(
                title: Text('Tudo dialog'),
                onPressed: () { print("click on press");    },
            );
          });
    }
    
    
    RaisedButton(
                  onPressed: () {
                    _showCustomDialog(context);
                  },
                  child: const Text("Custom Dialog"),
                ),
    

    完整代码包括其他示例代码

    import 'package:flutter/material.dart';
    import 'package:flutter/foundation.dart';
    import 'dart:async';
    import 'package:pin_code_fields/pin_code_fields.dart';
    
    class TudoDialogWidget extends StatefulWidget {
      const TudoDialogWidget({
        this.onPressed,
        this.title,
        this.height,
        this.width,
        this.alignment,
        this.padding,
        this.subText,
        this.hasTimerStopped,
        this.secondsremaining,
        this.timerfontsize,
        this.timercolor,
        this.timerfontWeight,
        this.passcode,
        this.ondone,
        this.onErrorcheck,
        this.hasError,
        this.buttontext,
        this.color,
        this.fontweight,
        this.fontsize,
      });
      final GestureTapCallback onPressed;
      final Widget title;
      final double height;
      final double width;
      final AlignmentGeometry alignment;
      final EdgeInsetsGeometry padding;
      final String subText;
      final bool hasTimerStopped;
      final int secondsremaining;
      final double timerfontsize;
      final Color timercolor;
      final FontWeight timerfontWeight;
      final String passcode;
      final ValueChanged<String> ondone;
      final ValueChanged<bool> onErrorcheck;
      final bool hasError;
      final String buttontext;
      final Color color;
      final FontWeight fontweight;
      final double fontsize;
    
      @override
      _TudoDialogWidgetState createState() => _TudoDialogWidgetState();
    }
    
    class _TudoDialogWidgetState extends State<TudoDialogWidget> {
    
      bool hasTimerStopped = false;
      String passcode;
      final changeNotifier = StreamController<Functions>.broadcast();
      bool hasError = false;
      @override
      Widget build(BuildContext context) {
        return AlertDialog(
          title: widget.title ?? Text("Dialog Title"),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Container(
                  height: widget.height ?? MediaQuery.of(context).size.height / 2.4,
                  width: widget.width ?? MediaQuery.of(context).size.height,
                  alignment: widget.alignment,
                  child: ListView(
                    children: <Widget>[
                      Padding(
                        padding: widget.padding ??
                            const EdgeInsets.symmetric(vertical: 8.0),
                        child: Text(
                          widget.subText ?? 'Enter Your Subtext Here!!',
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 15,
                              color: Colors.black),
                          textAlign: TextAlign.center,
                        ),
                      ),
                      Center(
                        child: CountDownTimer(
                          secondsRemaining: widget.secondsremaining ?? 300,
                          whenTimeExpires: () {
                            setState(() {
                              hasTimerStopped = widget.hasTimerStopped;
                            });
                          },
                          countDownTimerStyle: TextStyle(
                            fontSize: widget.timerfontsize ?? 25,
                            color: widget.timercolor ?? Colors.amber,
                            fontWeight: widget.timerfontWeight ?? FontWeight.bold,
                          ),
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.symmetric(
                            vertical: 8.0, horizontal: 30),
                        child: PinCodeTextField(
                          length: 6, // must be greater than 0
                          obsecureText: false,
                          shape: PinCodeFieldShape.underline,
                          onDone: widget.ondone,
                          // onDone: (String value) {
                          //   setState(() {
                          //     passcode = value;
                          //     print(value);
                          //   });
                          // },
    
                          textStyle: TextStyle(
                              fontWeight: FontWeight
                                  .bold), //optinal, default is TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold)
                          onErrorCheck: widget.onErrorcheck,
                          shouldTriggerFucntions:
                          changeNotifier.stream.asBroadcastStream(),
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.symmetric(horizontal: 30.0),
                        child: Text(
                          hasError
                              ? "*Please fill up all the cells and press VERIFY again"
                              : "",
                          style:
                          TextStyle(color: Colors.red.shade300, fontSize: 12),
                        ),
                      ),
                      SizedBox(
                        height: 5,
                      ),
                      RichText(
                        textAlign: TextAlign.center,
                        text: TextSpan(
                            text: "Didn't receive the code? ",
                            style: TextStyle(color: Colors.black54, fontSize: 15),
                            children: [
                              TextSpan(
                                  text: " RESEND",
                                  // recognizer: onTapRecognizer,
                                  style: TextStyle(
                                      color: widget.color,
                                      fontWeight:
                                      widget.fontweight ?? FontWeight.bold,
                                      fontSize: widget.fontsize ?? 16))
                            ]),
                      ),
                      SizedBox(
                        height: 7,
                      ),
                      Container(
                        margin: const EdgeInsets.symmetric(
                            vertical: 16.0, horizontal: 30),
                        child: ButtonTheme(
                          height: 50,
                          child: FlatButton(
                            onPressed: widget.onPressed,
                            child: Center(
                                child: Text(
                                  widget.buttontext ?? "VERIFY".toUpperCase(),
                                  style: TextStyle(
                                      color: Colors.white,
                                      fontSize: 18,
                                      fontWeight: FontWeight.bold),
                                )),
                          ),
                        ),
                        decoration: BoxDecoration(
                          color: widget.color ?? Colors.blue,
                          borderRadius: BorderRadius.circular(5),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text('Close'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      }
    }
    
    class CountDownTimer extends StatefulWidget {
      const CountDownTimer({
        Key key,
        int secondsRemaining,
        this.countDownTimerStyle,
        this.whenTimeExpires,
        this.countDownFormatter,
      })  : secondsRemaining = secondsRemaining,
            super(key: key);
    
      final int secondsRemaining;
      final Function whenTimeExpires;
      final Function countDownFormatter;
      final TextStyle countDownTimerStyle;
    
      State createState() =>  _CountDownTimerState();
    }
    
    class _CountDownTimerState extends State<CountDownTimer>
        with TickerProviderStateMixin {
      AnimationController _controller;
      Duration duration;
      String formatHHMMSS(int seconds) {
        int hours = (seconds / 3600).truncate();
        seconds = (seconds % 3600).truncate();
        int minutes = (seconds / 60).truncate();
    
        String hoursStr = (hours).toString().padLeft(2, '0');
        String minutesStr = (minutes).toString().padLeft(2, '0');
        String secondsStr = (seconds % 60).toString().padLeft(2, '0');
    
        if (hours == 0) {
          return "$minutesStr:$secondsStr";
        }
    
        return "$hoursStr:$minutesStr:$secondsStr";
      }
    
      String get timerDisplayString {
        Duration duration = _controller.duration * _controller.value;
        return widget.countDownFormatter != null
            ? widget.countDownFormatter(duration.inSeconds)
            : formatHHMMSS(duration.inSeconds);
        // In case user doesn't provide formatter use the default one
        // for that create a method which will be called formatHHMMSS or whatever you like
      }
    
      @override
      void initState() {
        super.initState();
        duration =  Duration(seconds: widget.secondsRemaining);
        _controller =  AnimationController(
          vsync: this,
          duration: duration,
        );
        _controller.reverse(from: widget.secondsRemaining.toDouble());
        _controller.addStatusListener((status) {
          if (status == AnimationStatus.completed ||
              status == AnimationStatus.dismissed) {
            widget.whenTimeExpires();
          }
        });
      }
    
      @override
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return  Center(
            child: AnimatedBuilder(
                animation: _controller,
                builder: (_, Widget child) {
                  return Text(
                    timerDisplayString,
                    style: widget.countDownTimerStyle,
                  );
                }));
      }
    }
    
    class UnicornAlertDialog extends StatelessWidget {
      const UnicornAlertDialog({
        Key key,
        @required this.gradient,
        this.title,
        this.titlePadding,
        this.titleTextStyle,
        this.content,
        this.contentPadding = const EdgeInsets.fromLTRB(24.0, 20.0, 24.0, 24.0),
        this.contentTextStyle,
        this.actions,
        this.backgroundColor,
        this.elevation,
        this.semanticLabel,
        this.shape,
      })  : assert(contentPadding != null),
            super(key: key);
    
      final Gradient gradient;
      final Widget title;
      final EdgeInsetsGeometry titlePadding;
      final TextStyle titleTextStyle;
      final Widget content;
      final EdgeInsetsGeometry contentPadding;
      final TextStyle contentTextStyle;
      final List<Widget> actions;
      final Color backgroundColor;
      final double elevation;
      final String semanticLabel;
      final ShapeBorder shape;
    
      @override
      Widget build(BuildContext context) {
        assert(debugCheckHasMaterialLocalizations(context));
        final ThemeData theme = Theme.of(context);
        final DialogTheme dialogTheme = DialogTheme.of(context);
        final List<Widget> children = <Widget>[];
        String label = semanticLabel;
    
        if (title != null) {
          children.add(Padding(
            padding: titlePadding ?? EdgeInsets.fromLTRB(24.0, 24.0, 24.0, content == null ? 20.0 : 0.0),
            child: DefaultTextStyle(
              style: titleTextStyle ?? dialogTheme.titleTextStyle ?? theme.textTheme.title,
              child: Semantics(
                child: title,
                namesRoute: true,
                container: true,
              ),
            ),
          ));
        } else {
          switch (defaultTargetPlatform) {
            case TargetPlatform.iOS:
              label = semanticLabel;
              break;
            case TargetPlatform.android:
            case TargetPlatform.fuchsia:
              label = semanticLabel ?? MaterialLocalizations.of(context)?.alertDialogLabel;
          }
        }
    
        if (content != null) {
          children.add(Flexible(
            child: Padding(
              padding: contentPadding,
              child: DefaultTextStyle(
                style: contentTextStyle ?? dialogTheme.contentTextStyle ?? theme.textTheme.subhead,
                child: content,
              ),
            ),
          ));
        }
    
        if (actions != null) {
          children.add(ButtonTheme.bar(
            child: ButtonBar(
              children: actions,
            ),
          ));
        }
    
        Widget dialogChild = IntrinsicWidth(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: children,
          ),
        );
    
        if (label != null)
          dialogChild = Semantics(
            namesRoute: true,
            label: label,
            child: dialogChild,
          );
    
        return Dialog(
          backgroundColor: backgroundColor,
          gradient: gradient,
          elevation: elevation,
          shape: shape,
          child: dialogChild,
        );
      }
    }
    
    class Dialog extends StatelessWidget {
      const Dialog({
        Key key,
        this.gradient,
        this.backgroundColor,
        this.elevation,
        this.insetAnimationDuration = const Duration(milliseconds: 100),
        this.insetAnimationCurve = Curves.decelerate,
        this.shape,
        this.child,
      }) : super(key: key);
    
      final Color backgroundColor;
      final double elevation;
      final Duration insetAnimationDuration;
      final Curve insetAnimationCurve;
      final ShapeBorder shape;
      final Widget child;
      final Gradient gradient;
    
      static const RoundedRectangleBorder _defaultDialogShape =
      RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0)));
      static const double _defaultElevation = 24.0;
    
      @override
      Widget build(BuildContext context) {
        final DialogTheme dialogTheme = DialogTheme.of(context);
        return AnimatedPadding(
          padding: MediaQuery.of(context).viewInsets + const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0),
          duration: insetAnimationDuration,
          curve: insetAnimationCurve,
          child: MediaQuery.removeViewInsets(
            removeLeft: true,
            removeTop: true,
            removeRight: true,
            removeBottom: true,
            context: context,
            child: Center(
              child: ConstrainedBox(
                constraints: const BoxConstraints(minWidth: 280.0),
                child: Material(
                  color: backgroundColor ?? dialogTheme.backgroundColor ?? Theme.of(context).dialogBackgroundColor,
                  elevation: elevation ?? dialogTheme.elevation ?? _defaultElevation,
                  shape: shape ?? dialogTheme.shape ?? _defaultDialogShape,
                  type: MaterialType.card,
                  child: ClipRRect(
                    borderRadius: _defaultDialogShape.borderRadius,
                    child: Container(
                      decoration: BoxDecoration(
                          gradient: gradient
                      ),
                      child: child,
                    ),
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }
    
    
    
    _showDialog(BuildContext context) {
      showDialog(
          context: context,
          builder: (context) {
            return UnicornAlertDialog(
                title: GestureDetector(
                  onTap: () { print("on tap title");},
                  child: Column(
                    children: <Widget>[
                      Container(
                        child: Image.asset('assets/images/background.jpg'),
                      ),
                      const SizedBox(height: 15.0),
                      Container(
                        child: Text(
                          'Verify',
                          textAlign: TextAlign.center,
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 20.0,
                          ),
                        ),
                      )
                    ],
                  ),
                ),
                content: GestureDetector(
                  onTap: () { print("on tap content");},
                  child: Text('You have successfully verified your mobile number',
                      textAlign: TextAlign.center,
                      style: TextStyle(color: Colors.white, fontSize: 15.0)),
                ),
                gradient: LinearGradient(
                  colors: <Color>[
                    Color(0xDD4a00e0),
                    Color(0xFF8e2de2),
                  ],
                  begin: Alignment.topCenter,
                  end: Alignment.bottomCenter,
                ),
                actions: <Widget>[
    
    
                ]
            );
          });
    }
    
    _showCustomDialog(BuildContext context) {
      showDialog(
          context: context,
          builder: (context) {
            return TudoDialogWidget(
                title: Text('Tudo dialog'),
                onPressed: () { print("click on press");    },
            );
          });
    }
    
    Future<void> _ackAlert(BuildContext context) {
      return showDialog<void>(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Not in stock'),
            content: const Text('This item is no longer available'),
            actions: <Widget>[
              FlatButton(
                child: Text('Ok'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
    }
    enum ConfirmAction { CANCEL, ACCEPT }
    Future<ConfirmAction> _asyncConfirmDialog(BuildContext context) async {
      return showDialog<ConfirmAction>(
        context: context,
        barrierDismissible: false, // user must tap button for close dialog!
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Reset settings?'),
            content: const Text(
                'This will reset your device to its default factory settings.'),
            actions: <Widget>[
              FlatButton(
                child: const Text('CANCEL'),
                onPressed: () {
                  Navigator.of(context).pop(ConfirmAction.CANCEL);
                },
              ),
              FlatButton(
                child: const Text('ACCEPT'),
                onPressed: () {
                  Navigator.of(context).pop(ConfirmAction.ACCEPT);
                },
              )
            ],
          );
        },
      );
    }
    
    Future<String> _asyncInputDialog(BuildContext context) async {
      String teamName = '';
      return showDialog<String>(
        context: context,
        barrierDismissible: false, // dialog is dismissible with a tap on the barrier
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Enter current team'),
            content:  Row(
              children: <Widget>[
                 Expanded(
                    child:  TextField(
                      autofocus: true,
                      decoration:  InputDecoration(
                          labelText: 'Team Name', hintText: 'eg. Juventus F.C.'),
                      onChanged: (value) {
                        teamName = value;
                      },
                    ))
              ],
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('Ok'),
                onPressed: () {
                  Navigator.of(context).pop(teamName);
                },
              ),
            ],
          );
        },
      );
    }
    
    enum Departments { Production, Research, Purchasing, Marketing, Accounting }
    
    Future<Departments> _asyncSimpleDialog(BuildContext context) async {
      return await showDialog<Departments>(
          context: context,
          barrierDismissible: true,
          builder: (BuildContext context) {
            return SimpleDialog(
              title: const Text('Select Departments '),
              children: <Widget>[
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context, Departments.Production);
                  },
                  child: const Text('Production'),
                ),
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context, Departments.Research);
                  },
                  child: const Text('Research'),
                ),
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context, Departments.Purchasing);
                  },
                  child: const Text('Purchasing'),
                ),
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context, Departments.Marketing);
                  },
                  child: const Text('Marketing'),
                ),
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context, Departments.Accounting);
                  },
                  child: const Text('Accounting'),
                )
              ],
            );
          });
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return  Scaffold(
          appBar: AppBar(
            title: Text("Dialog"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                 RaisedButton(
                  onPressed: () {
                    _showCustomDialog(context);
                  },
                  child: const Text("Custom Dialog"),
                ),
                 RaisedButton(
                  onPressed: () {
                    _showDialog(context);
                  },
                  child: const Text("Unicon Dialog"),
                ),
                 RaisedButton(
                  onPressed: () {
                    _ackAlert(context);
                  },
                  child: const Text("Ack Dialog"),
                ),
                 RaisedButton(
                  onPressed: () async {
                    final ConfirmAction action = await _asyncConfirmDialog(context);
                    print("Confirm Action $action" );
                  },
                  child: const Text("Confirm Dialog"),
                ),
                 RaisedButton(
                  onPressed: () async {
                    final Departments deptName = await _asyncSimpleDialog(context);
                    print("Selected Departement is $deptName");
                  },
                  child: const Text("Simple dialog"),
                ),
                 RaisedButton(
                  onPressed: () async {
                    final String currentTeam = await _asyncInputDialog(context);
                    print("Current team name is $currentTeam");
                  },
                  child: const Text("Input Dialog"),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    void main() {
      runApp( MaterialApp(home:  MyApp()));
    }
    

    【讨论】:

    • 好的,等一下,我会在那里分享我的 GitHub 存储库,你可以获得完整的项目,所以我希望当用户注册时,当他确认 OTP 后,他会通过电子邮件收到 OTP,他将重定向到 Main屏幕但在代码中,我已经写了但它不工作
    • github.com/rutvikgumasana/signup 这是代码,请检查一下,请帮助我,我非常需要它:) 你能修复错误处理吗?
    • 我建议你发布一个新问题并标记 redux,因为它不是对话问题,因为对 redux 有更好了解的人可以帮助你。
    • 谢谢哥们,如果你能帮助我,我们将永远感激你的帮助
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2021-04-12
    • 2023-03-11
    • 2021-04-08
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多