Code Monkey home page Code Monkey logo

flutter_smart_dialog's Introduction

pub stars issues commit

Feature and Usage(Must read!):super detailed guide

功能和用法(必看!): 超详细指南


Language: English | 中文

Migrate doc:3.x migrate 4.0 | 3.x 迁移 4.0

Flutter 2:Please use flutter_smart_dialog: 4.2.5

Introduction

An elegant Flutter Dialog solution.

Some Effect

attachLocationAndPoint

attachHighlight

dialogStack

loadingCustom

toastCustom

Advantage

  • Do not need BuildContext

  • Can penetrate dark background, click on the page behind dialog

  • Support dialog stack,close the specified dialog

  • Support positioning widget, display the specified location dialog

  • Support highlight feature,dissolve the specified location mask

  • Easily implement toast,loading,attach dialog,custome dialog

Quick start

Install

Initialization

initialization

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage,
      // here
      navigatorObservers: [FlutterSmartDialog.observer],
      // here
      builder: FlutterSmartDialog.init(),
    );
  }
}

Advanced initialization: configure global custom Loading and Toast

SmartDialog's showLoading and showToast provide a default style. Of course, custom param are definitely supported.

  • SmartDialog custom Loading or Toast is very simple: However, when using it, it may make you feel a little troublesome
  • for example
    • Use custom Loading: SmartDialog.showLoading(builder: (_) => CustomLoadingWidget);
    • The effect we want must be like this: SmartDialog.showLoading();
  • In view of the above considerations, I added the function of setting custom default Loading and Toast styles at the entrance

Let me show you the following

  • The entry needs to be configured: implement toastBuilder and loadingBuilder, and pass in custom Toast and Loading
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
      // here
      navigatorObservers: [FlutterSmartDialog.observer],
      // here
      builder: FlutterSmartDialog.init(
        //default toast widget
        toastBuilder: (String msg) => CustomToastWidget(msg: msg),
        //default loading widget
        loadingBuilder: (String msg) => CustomLoadingWidget(msg: msg),
      ),
    );
  }
}

Easy usage

  • toast usage💬
SmartDialog.showToast('test toast');

toastDefault

  • loading usage
SmartDialog.showLoading();
await Future.delayed(Duration(seconds: 2));
SmartDialog.dismiss(); 

loadingDefault

  • dialog usage🎨
SmartDialog.show(builder: (context) {
  return Container(
    height: 80,
    width: 180,
    decoration: BoxDecoration(
      color: Colors.black,
      borderRadius: BorderRadius.circular(10),
    ),
    alignment: Alignment.center,
    child:
    Text('easy custom dialog', style: TextStyle(color: Colors.white)),
  );
});

dialogEasy

You may have questions

For details, please check: Some Consideration Details

initBack

hardClose

Attach Chapter

For details, please check: Attach Chapter Details

This is a very important function. I wanted to add it a long time ago, but it was busy and has been shelved; New Year's Day (2022.1.1) started, and it took some time to complete this function and related demos.

attachLocation

attachImitate

attachGuide

Dialog Chapter

For details, please check: Dialog Chapter Details

dialogLocation

dialogPenetrate

dialogStack

Loading Chapter

For details, please check: Loading Chapter Details

loadingOne

loadingSmile

loadingNormal

Toast Chapter

For details, please check: Toast Chapter Details

toastOne

toastSmart

toastCustom

flutter_smart_dialog's People

Contributors

alexv525 avatar heap-hop avatar maninthewind avatar moxiaov587 avatar xdd666t avatar z624821876 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_smart_dialog's Issues

The provided entry used for `below` must be present in the Overlay.

初始化了,在initState里面添加监听中showToast报错,
image

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: 'package:flutter/src/widgets/overlay.dart': Failed assertion: line 402 pos 7: 'below == null || (below._overlay == this && _entries.contains(below) && (newEntries?.contains(below) ?? true))': The provided entry used for `below` must be present in the Overlay. E/flutter (27604): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61) E/flutter (27604): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5) E/flutter (27604): #2 OverlayState._debugVerifyInsertPosition (package:flutter/src/widgets/overlay.dart:402:7) E/flutter (27604): #3 OverlayState.insert (package:flutter/src/widgets/overlay.dart:355:12) E/flutter (27604): #4 CustomDialog._handleDialogStack (package:flutter_smart_dialog/src/custom/custom_dialog.dart:198:45) E/flutter (27604): #5 CustomDialog._handleMustOperate (package:flutter_smart_dialog/src/custom/custom_dialog.dart:143:5) E/flutter (27604): #6 CustomDialog.show (package:flutter_smart_dialog/src/custom/custom_dialog.dart:51:10) E/flutter (27604): #7 DialogProxy.show (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:80:19) E/flutter (27604): #8 SmartDialog.show (package:flutter_smart_dialog/src/smart_dialog.dart:181:33) E/flutter (27604): #9 _ShakePageState._shakeEvent (package:flutter_shake/pages/shake.dart:85:23) E/flutter (27604): #10 _ShakePageState.initState. (package:flutter_shake/pages/shake.dart:173:47) E/flutter (27604): #11 _ShakePageState.initState. (package:flutter_shake/pages/shake.dart:173:11) E/flutter (27604): #12 _rootRunUnary (dart:async/zone.dart:1434:47) E/flutter (27604): #13 _CustomZone.runUnary (dart:async/zone.dart:1335:19) E/flutter (27604): #14 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) E/flutter (27604): #15 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11) E/flutter (27604): #16 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7) E/flutter (27604): #17 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:123:11) E/flutter (27604): #18 _MapStream._handleData (dart:async/stream_pipe.dart:218:10) E/flutter (27604): #19 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13) E/flutter (27604): #20 _rootRunUnary (dart:async/zone.dart:1434:47) E/flutter (27604): #21 _CustomZone.runUnary (dart:async/zone.dart:1335:19) E/flutter (27604): #22 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) E/flutter (27604): #23 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11) E/flutter (27604): #24 _DelayedData.perform (dart:async/stream_impl.dart:591:14) E/flutter (27604): #25 _StreamImplEvents.handleNext (dart:async/stream_impl.dart:706:11) E/flutter (27604): #26 _PendingEvents.schedule. (dart:async/stream_impl.dart:663:7) E/flutter (27604): #27 _rootRun (dart:async/zone.dart:1418:47) E/flutter (27604): #28 _CustomZone.run (dart:async/zone.dart:1328:19) E/flutter (27604): #29 _CustomZone.runGuarded (dart:async/zone.dart:1236:7) E/flutter (27604): #30 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1276:23) E/flutter (27604): #31 _rootRun (dart:async/zone.dart:1426:13) E/flutter (27604): #32 _CustomZone.run (dart:async/zone.dart:1328:19) E/flutter (27604): #33 _CustomZone.runGuarded (dart:async/zone.dart:1236:7) E/flutter (27604): #34 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1276:23) E/flutter (27604): #35 _microtaskLoop (dart:async/schedule_microtask.dart:40:21) E/flutter (27604): #36 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5) E/flutter (27604):

冲突

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building _CupertinoTextSelectionControlsToolbar(dirty,
flutter: dependencies: [_LocalizationsScope-[GlobalKey#5f58e], MediaQuery], state:
flutter: _CupertinoTextSelectionControlsToolbarState#83e6b):
flutter: No CupertinoLocalizations found.
flutter: _CupertinoTextSelectionControlsToolbar widgets require CupertinoLocalizations to be provided by a
flutter: Localizations widget ancestor.
flutter: The cupertino library uses Localizations to generate messages, labels, and abbreviations.
flutter: To introduce a CupertinoLocalizations, either use a CupertinoApp at the root of your application to
flutter: include them automatically, or add a Localization widget with a CupertinoLocalizations delegate.
flutter: The specific widget that could not find a CupertinoLocalizations ancestor was:
flutter:   _CupertinoTextSelectionControlsToolbar
flutter: The ancestors of this widget were:
flutter:   ...
flutter:   Builder
flutter:   CompositedTransformFollower
flutter:   FadeTransition
flutter:   Directionality
flutter:   _EffectiveTickerMode
flutter:   ...
flutter:
flutter: The relevant error-causing widget was:
flutter:   FlutterSmartDialog
flutter:   file:///Users/jack/Documents/work/code/work/flutter/wallet/wallet/lib/main.dart:86:20
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      debugCheckHasCupertinoLocalizations.<anonymous closure> (package:flutter/src/cupertino/debug.dart:23:7)
flutter: #1      debugCheckHasCupertinoLocalizations (package:flutter/src/cupertino/debug.dart:43:4)
flutter: #2      CupertinoLocalizations.of (package:flutter/src/cupertino/localizations.dart:262:12)
flutter: #3      _CupertinoTextSelectionControlsToolbarState.build (package:flutter/src/cupertino/text_selection.dart:135:73)
flutter: #4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4691:27)
flutter: #5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4574:15)
flutter: #6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4746:11)
flutter: #7      Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
flutter: #8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4553:5)
flutter: #9      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4737:11)
flutter: #10     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4548:5)
flutter: ...     Normal element mounting (39 frames)
flutter: #49     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)
flutter: #50     MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6221:36)
flutter: #51     Element.updateChild (package:flutter/src/widgets/framework.dart:3363:18)
flutter: #52     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5654:32)
flutter: #53     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6243:17)
flutter: #54     Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
flutter: #55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4599:16)
flutter: #56     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4746:11)
flutter: #57     Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
flutter: #58     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2582:33)
flutter: #59     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:875:21)
flutter: #60     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:328:5)
flutter: #61     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
flutter: #62     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
flutter: #63     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:998:5)
flutter: #67     _invoke (dart:ui/hooks.dart:163:10)
flutter: #68     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:259:5)
flutter: #69     _drawFrame (dart:ui/hooks.dart:126:31)
flutter: (elided 3 frames from dart:async)
flutter:
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

      builder: (BuildContext context, Widget child) {
        return FlutterSmartDialog(child: child);
      },

长按输入框报错,

image

Toast is opened with a delay

Steps to reproduce

  1. Open the toast with the time parameter of 5 seconds
  2. Close the toast using SmartDialog.dismiss(status: SmartStatus.toast); within 1 second
  3. Open the same toast again

Actual Result: The toast will wait for 4 seconds to open up again
Expected Result: The toast should open up immediately.

空安全

Restarted application in 1,318ms.
E/flutter ( 3366): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
E/flutter ( 3366): #0 new MonitorPopRoute._
package:flutter_smart_dialog/…/helper/monitor_pop_route.dart:15
E/flutter ( 3366): #1 MonitorPopRoute.instance
package:flutter_smart_dialog/…/helper/monitor_pop_route.dart:12
E/flutter ( 3366): #2 FlutterSmartDialog.monitor
package:flutter_smart_dialog/src/dialog.dart:17
E/flutter ( 3366): #3 FlutterSmartDialog.init
package:flutter_smart_dialog/src/dialog.dart:21

the alignment param in SmartDialog.showToast does not work

I found the ToastWidget (in src/widget/toast_widget) has his own Align. Then I custom the default toast widget without the Align.It works.

class ToastWidget extends StatelessWidget {
  ToastWidget({Key? key, required this.msg}) : super(key: key);

  ///toast msg
  final String msg;

  @override
  Widget build(BuildContext context) {
    return Align(
      alignment: Alignment.bottomCenter,
      child: Container(
        margin: EdgeInsets.symmetric(horizontal: 30, vertical: 50),
        padding: EdgeInsets.symmetric(horizontal: 25, vertical: 10),
        decoration: BoxDecoration(
          color: Colors.black,
          borderRadius: BorderRadius.circular(20),
        ),
        child: Text('$msg', style: TextStyle(color: Colors.white)),
      ),
    );
  }
}

LateInitializationError: Field 'toastBuilder'

Hi, i'm calling: SmartDialog.showToast('test toast') on onpressed event, but i get the follow error:

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field 'toastBuilder' has not been initialized.
E/flutter ( 6841): #0 DialogProxy.toastBuilder (package:flutter_smart_dialog/src/helper/dialog_proxy.dart)
E/flutter ( 6841): #1 SmartDialog.showToast (package:flutter_smart_dialog/src/smart_dialog.dart:529:46)

SmartDialog.config 定义的全局alignment属性不能正确传递到toastBuilder

如题,我初始化的samartDialog.config的alignment为center,但是在toastbuilder传入的还是默认的bottomcenter,
SmartDialog.config ..alignment = Alignment.center ..isPenetrate = false ..clickBgDismiss = false ..maskWidget = maskWidget ..animationDuration = Duration(milliseconds: 260) ..isUseAnimation = true ..isLoading = true ..debounce = true ..debounceTime = Duration(milliseconds: 300);
所以我不得不toastbuilder里重新定义一次alignment
toastBuilder: ( String msg, AlignmentGeometry alignment, ) { return CustomToastWidget( text: msg, alignment: const Alignment(0.0, 0.8), ); }, loadingBuilder: ( String msg, Color background, ) { return CustomLoadingWidget(); },
建议 在 config 传入的alignment能够打通到toastbuilder,这样只需要定义一次alignment就可以了

优化

版本3.0

  1. 需要增加一个关闭所有dialog的方法。
  2. 由于Overlayentry 被单例持有 不会更新,导致flutter inspector中的selelct widget mode功能报错,建议在FlutterSmartDialog,initState里面 重新创建所有overlayentry

调用void _showToast() async { await SmartDialog.showToast('test toast'); print('--------------------------'); }报错

Reload already in progress, ignoring request
Restarted application in 992ms.
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field '_toast@819397047' has not been initialized.
#0 DialogProxy._toast (package:flutter_smart_dialog/src/helper/dialog_proxy.dart)
package:flutter_smart_dialog/…/helper/dialog_proxy.dart:1
#1 DialogProxy.showToast
package:flutter_smart_dialog/…/helper/dialog_proxy.dart:118
#2 SmartDialog.showToast
package:flutter_smart_dialog/src/smart_dialog.dart:262
#3 _showToast
package:test1/FlutterSmartDialog/flutter_smart_dialog.dart:39
#4 FlutterSmartDialog.build.
package:test1/FlutterSmartDialog/flutter_smart_dialog.dart:17

能不能指定弹窗的层级,解决页面间跳转到问题。

版本信息

  • Flutter版本:v2.10.4
  • flutter_smart_dialog版本:v3.4.1

需求

能不能指定弹窗的层级,否则未关闭弹窗是,通过 Navigator.of(context).pushNamed 跳转页面,弹窗仍然会覆盖在新页面上面。关闭弹窗可以解决一部分问题,但是有些弹窗需要返回原页面时仍展示着。

问题demo

暂无

弹出框关回调.

弹出框是关闭完成后,调用回调,可以开始关闭之前调用回调吗

求助:关闭loading后短时间内再次调用会报错

我在dio interceptor中加入了loading,
以下是示例代码:

Set<String> pendingRequest = {};

String _generateRequestHash({
  required RequestOptions options,
}) {
  var params = options.data ?? options.queryParameters;
  return options.path + params.toString();
}

class CommonInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    if (options.extra['noLoading'] == false) {
      pendingRequest.add(_generateRequestHash(options: options));
      log(pendingRequest.toString());
      if (pendingRequest.length == 1) {
        SmartDialog.showLoading();
      }
    }
    return handler.next(options);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {

      pendingRequest
          .remove(_generateRequestHash(options: response.requestOptions));
      if (pendingRequest.isEmpty) {
        SmartDialog.dismiss(status: SmartStatus.loading);
      }

    int statusCode = response.data?['status_code'];

     // 一些业务逻辑
  }

  @override
  Future<void> onError(DioError err, ErrorInterceptorHandler handler) async {
    if (err.response != null) {
      pendingRequest
          .remove(_generateRequestHash(options: err.requestOptions));
      if (pendingRequest.isEmpty) {
        SmartDialog.dismiss(status: SmartStatus.loading);
      }
    }
    FetchException appException = FetchException.create(err);
    // 错误提示
    err.error = appException;
    return super.onError(err, handler);
  }
}

其实也就是在请求时调用,在pending request中加入本次请求的信息并根据长度判断是否调用loading,然后在responsed中移除该request并移除loading, 但在某些场景中,比如用户登陆成功后需要再次发起请求获取登陆成功后跳转页面的数据就会出现以下错误:

[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: 'package:flutter/src/animation/animation_controller.dart': Failed assertion: line 487 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:51:61)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
#2      AnimationController.reverse (package:flutter/src/animation/animation_controller.dart:487:7)
#3      _SmartDialogWidgetState.dismiss (package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart:182:14)
#4      SmartDialogController.dismiss (package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart:208:19)
<asynchronous suspension>
#5      MainDialog.dismiss (package:flutter_smart_dialog/src/custom/main_dialog.dart:145:5)
<asynchronous suspension>
#6      CustomLoading.dismiss (package:flutter_smart_dialog/src/custom/custom_load<…>

补充: 改错误是在第N次请求完成后调用SmartDialog.dismiss后出现的

Loading 在页面初始化之后 调用 不会显示

版本信息

  • Flutter版本:[举例:v2.10.4]
  • flutter_smart_dialog版本:[举例:v4.0.0]

描述bug/需求

使用GetX框架, 在onInit的时候,调用SmartDialog.showLoading, 页面不显示Loading, 放在onReady是可以显示的,带页面展示出来候后 ,再次调用就会显示Loading,初步判断和生命周期有关,希望可以快速解决下,我这面花了一上午把Loading 和 Toast替换成你这个库呢,不然又要改回去😂

问题demo

Unhandled Exception: 'package:flutter/src/animation/animation_controller.dart': Failed assertion: line 487 pos 7: '_ticker != null': AnimationController.reverse() called after AnimationController.dispose()

版本信息

  • Flutter版本:[v2.8.1]
  • flutter_smart_dialog版本:[v3.4.1]

描述bug

显示loading弹窗的时候会偶尔会报这个异常,
快速切换菜单的时候。多次调用showLoading

问题

E/flutter (11733): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: 'package:flutter/src/animation/animation_controller.dart': Failed assertion: line 487 pos 7: '_ticker != null': AnimationController.reverse() called after AnimationController.dispose()
E/flutter (11733): AnimationController methods should not be used after calling dispose.
E/flutter (11733): _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:47:61)
E/flutter (11733): _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter (11733): AnimationController.reverse (package:flutter/src/animation/animation_controller.dart:487:7)
E/flutter (11733): _SmartDialogWidgetState.dismiss (package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart:182:14)
E/flutter (11733): SmartDialogController.dismiss (package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart:208:19)
E/flutter (11733):
E/flutter (11733): MainDialog.dismiss (package:flutter_smart_dialog/src/custom/main_dialog.dart:145:5)
E/flutter (11733):
E/flutter (11733): CustomLoading.dismiss (package:flutter_smart_dialog/src/custom/custom_loading.dart:48:5)
E/flutter (11733):
E/flutter (11733): DialogProxy.dismiss (package:flutter_smart_dialog/src/helper/dialog_proxy.dart:213:7)
E/flutter (11733):
E/flutter (11733): SmartDialog.dismiss (package:flutter_smart_dialog/src/smart_dialog.dart:580:5)
E/flutter (11733):
E/flutter (11733):

v2.3.8 toast

SmartDialog.showToast 为什么去掉了isDefaultDismissType 这个参数,多个toast不友好

控制台报错

使用版本: 3.0.6

当我尝试在webview中的onPageStartedonPageFinished中分别调用
SmartDialog.showLoading( msg: '正在加载...', maskColorTemp: Colors.transparent, isPenetrateTemp: true, );
SmartDialog.dismiss(status: SmartStatus.loading);

当我刷新过快时,控制台报错

E/flutter ( 4140): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: setState() called after dispose(): SmartDialogViewState#f5408(lifecycle state: defunct, not mounted, ticker inactive)
E/flutter ( 4140): This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback.
E/flutter ( 4140): The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
E/flutter ( 4140): This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().
E/flutter ( 4140): #0      State.setState.<anonymous closure>
package:flutter/…/widgets/framework.dart:1052
E/flutter ( 4140): #1      State.setState
package:flutter/…/widgets/framework.dart:1087
E/flutter ( 4140): #2      SmartDialogViewState.initState.<anonymous closure>
package:flutter_smart_dialog/…/widget/smart_dialog_view.dart:76
E/flutter ( 4140): #3      new Future.delayed.<anonymous closure> (dart:async/future.dart:393:39)
E/flutter ( 4140): #4      _rootRun (dart:async/zone.dart:1420:47)
E/flutter ( 4140): #5      _CustomZone.run (dart:async/zone.dart:1328:19)
E/flutter ( 4140): #6      _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
E/flutter ( 4140): #7      _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1276:23)
E/flutter ( 4140): #8      _rootRun (dart:async/zone.dart:1428:13)
E/flutter ( 4140): #9      _CustomZone.run (dart:async/zone.dart:1328:19)
E/flutter ( 4140): #10     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1260:23)
E/flutter ( 4140): #11     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
E/flutter ( 4140): #12     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:395:19)
E/flutter ( 4140): #13     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:426:5)
E/flutter ( 4140): #14     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
E/flutter ( 4140):

Get.to 路由跳转到新界面后,没有覆盖住弹框

某些场景,PopA 是自定义的局部小组件内有一个按钮点击是如下回调处理Get.to 跳转,但是Get.to 路由跳转到登录界面后,期望覆盖住弹框。点击返回后任然可见弹框。除非在SmartDialog 使用界面点击弹框外主动关闭。目前是这个弹框一直在最顶层,跳转到LoginPage 后 弹框还是可见就不符合预期了。
SmartDialog.show(
widget: PopA((){
Get.to(LoginPage());
}));

问题展示图片:https://i.loli.net/2021/06/09/hyUocMZB7lDNmj6.png

字体问题

大神好:请问下字体怎么设置的,flutter项目默认字体,您的弹窗改变了字体
image

LateInitializationError: Field 'loadingBuilder' has not been initialized.

======== Exception caught by gesture ===============================================================
The following LateError was thrown while handling a gesture:
LateInitializationError: Field 'loadingBuilder' has not been initialized.

When the exception was thrown, this was the stack:
#0 DialogProxy.loadingBuilder (package:flutter_smart_dialog/src/helper/dialog_proxy.dart)
#1 SmartDialog.showLoading (package:flutter_smart_dialog/src/smart_dialog.dart:423:46)
#2 _PhoneLoginPageState.build.. (package:frogsell/login/ui/phone_login_page.dart:254:45)
#3 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#4 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:607:11)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#c9f9c
state: ready
won arena
finalPosition: Offset(190.0, 575.0)
finalLocalPosition: Offset(168.0, 4.0)
button: 1
sent tap down

当显示的dialog未关闭的时候,关闭页面,再次进入这个页面的时候会出现错误

当显示的dialog未关闭的时候,关闭页面,再次进入这个页面的时候会出现错误,有时候关闭后也会偶尔出现
出现异常。
版本:3.4.0+1
_AssertionError ('package:flutter/src/animation/animation_controller.dart': Failed assertion: line 487 pos 7: '_ticker != null': AnimationController.reverse() called after AnimationController.dispose()
AnimationController methods should not be used after calling dispose.)
image

当已经存在一个SmartDialog.show()的情况下,如果处于关闭中,第二个SmartDialog.show无法打开,程序异常

Field '_controller' has not been initialized.

感谢开发者提供这么棒的组件,我这里遇到一点小问题,冷启动应用时报如下错误:

Uncaught LateInitializationError: Field '_controller' has not been initialized.
    at Object.wrapException (js_helper.dart:1115)
    at Object._lateReadCheck (late_helper.dart:119)
    at main_dialog.dart:24
    at _wrapJsFunctionForAsync_closure.$protected (async_patch.dart:317)
    at _wrapJsFunctionForAsync_closure.call$2 (async_patch.dart:342)
    at Object._asyncStartSync (async_patch.dart:247)
    at MainDialog.dismiss$0 (main_dialog.dart:115)
    at custom_loading.dart:48
    at _wrapJsFunctionForAsync_closure.$protected (async_patch.dart:317)
    at _wrapJsFunctionForAsync_closure.call$2 (async_patch.dart:342)

环境: flutter web
启动命令: flutter run -d chrome --web-renderer html

flutter doctor :

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.8.1, on Manjaro Linux 5.10.89-1-MANJARO, locale zh_CN.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2020.3)
[✓] Android Studio
[✓] IntelliJ IDEA Ultimate Edition (version 2021.2)
[✓] Connected device (1 available)

• No issues found!

我的main.dart:

Future<void> main() async {
  await App.init();
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        SfGlobalLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('zh', 'CN'),
        const Locale('en', 'US'),
      ],
      locale: const Locale('zh'),

      navigatorKey: App.navigatorKey,
      title: NAME,
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: bgColor,
        canvasColor: secondaryColor,
        listTileTheme: ListTileThemeData(style: ListTileStyle.drawer),
      ),
      onGenerateRoute: (settings) {
        late Widget page;

        if (settings.name == home) {
          page = const LoginScreen();
        } else {
          page = HomeScreen(routeName: settings.name!);
        }
        return MaterialPageRoute(
          builder: (context) => page,
          settings: settings,
        );
      },
      home: const LoginScreen(),
      // smart dialog
      navigatorObservers: [FlutterSmartDialog.observer],
      builder: FlutterSmartDialog.init(),
      debugShowCheckedModeBanner: false,
    );
  }
}

出错的代码:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/src/data/base_controller.dart';
import 'package:flutter_smart_dialog/src/helper/config.dart';
import 'package:flutter_smart_dialog/src/widget/attach_dialog_widget.dart';
import 'package:flutter_smart_dialog/src/widget/smart_dialog_widget.dart';

///main function : customize dialog
class MainDialog {
  MainDialog({
    required this.config,
    required this.overlayEntry,
  }) : _widget = Container();

  ///OverlayEntry instance
  final OverlayEntry overlayEntry;

  ///config info
  final Config config;

  final _uniqueKey = UniqueKey();

  late BaseController _controller;   /// <------------------ 这里
  Completer? _completer;
  VoidCallback? _onDismiss;
  Widget _widget;

  Future<void> show({
    required Widget widget,
    required AlignmentGeometry alignment,
    required bool isPenetrate,
    required bool isUseAnimation,
    required Duration animationDuration,
    required bool isLoading,
    required Color maskColor,
    required Widget? maskWidget,
    required bool clickBgDismiss,
    required VoidCallback onBgTap,
    required VoidCallback? onDismiss,
  }) async {
    //custom dialog
    _widget = SmartDialogWidget(
      key: _uniqueKey,
      controller: _controller = SmartDialogController(),
      alignment: alignment,
      isPenetrate: isPenetrate,
      isUseAnimation: isUseAnimation,
      animationDuration: animationDuration,
      isLoading: isLoading,
      maskColor: maskColor,
      maskWidget: maskWidget,
      clickBgDismiss: clickBgDismiss,
      child: widget,
      onBgTap: onBgTap,
    );

    _handleCommonOperate(onDismiss: onDismiss);

    return _completer!.future;
  }

如何配置全局的自定义loading和toast

首先谢谢作者的辛苦工作!

  • 我有个疑问,如何配置全局的自定义loading和toast?
  • 我想,不会应该要每一次showloading都要传入一次自定义loadingwidget吧

其次,没有更好的办法像这样在main中传入自定义loading和toast呢

builder: FlutterSmartDialog.init(
  ...
  loadingWidget:()=>MyLoadingWidget(),
  toastWidget:()=>MyToastWidget(),
  ...
)

最后,还是非常谢谢作者!

能不能同时存在多个实例

比如我通过 SmartDiaload。showLoading() 弹loading的toast 的时候,如果再Smartdialog。show()弹出底部浮层,loadig
toast就会消失。即使没有调用 dismiss(),谢谢。

Unable to click the toast.

I created a toast with a custom widget and added an IconButton in it which is not clickable.
Or is there a better way to dismiss the toast by user's interaction apart from clickBgDismissTemp?

Below is the code snippet.

SmartDialog.showToast(
  'The message',
  isUseAnimationTemp: true,
  widget: Row(
    children: [
      Icon(
        Icons.ac_unit_outlined,
        color: Colors.white,
      ),
      const C10(),
      Expanded(
        child: Text(
          'The message',
          style: TextStyles.errorStyle.copyWith(
            color: Colors.white,
          ),
        ),
      ),
      IconButton(
        onPressed: () {
          SmartDialog.dismiss(status: SmartStatus.toast); // <-- This is not clickable. The debugger breakpoint doesn't stop here. 
        },
        icon: const Icon(
          Icons.add_business_rounded,
          color: Colors.white,
        ),
      ),
    ],
  ),
  time: _getTime(msg),
);

Flutter 2: Cannot configure in the builder parameters of MaterialApp

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SmartDialogPage(),
      builder: (BuildContext context, Widget child) {
        return FlutterSmartDialog(child: child);
      },
    );
  }
}

The error occurs:

The argument type 'FlutterSmartDialog Function(BuildContext, Widget)' can't be assigned to the parameter type 'Widget Function(BuildContext, Widget?)?'.

DropdownButton not working as widget of SmartDialog

Hello,

I wanted to use the SmartDialog with a DropdrownButton as widget. When calling the show method of the SmartDialog, the SmartDialog appears displaying the DropdownButton but when clicking on the DropdownButton nothing happen and there is this output in the terminal:

`======== Exception caught by gesture ===============================================================
The following assertion was thrown while handling a gesture:
Navigator operation requested with a context that does not include a Navigator.

The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
When the exception was thrown, this was the stack:
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/internal/js_dev_runtime/private/ddc_runtime/errors.dart 251:49 throw
packages/flutter/src/widgets/navigator.dart 2741:9
packages/flutter/src/widgets/navigator.dart 2747:14 of
packages/flutter/src/material/dropdown.dart 1341:48 [_handleTap]
packages/flutter/src/gestures/recognizer.dart 193:24 invokeCallback
packages/flutter/src/gestures/tap.dart 608:48 handleTapUp
packages/flutter/src/gestures/tap.dart 296:5 [_checkUp]
packages/flutter/src/gestures/tap.dart 230:7 handlePrimaryPointer
packages/flutter/src/gestures/recognizer.dart 558:9 handleEvent
packages/flutter/src/gestures/pointer_router.dart 94:12 [_dispatch]
packages/flutter/src/gestures/pointer_router.dart 139:9
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart 21:13 forEach
packages/flutter/src/gestures/pointer_router.dart 137:17 [_dispatchEventToRoutes]
packages/flutter/src/gestures/pointer_router.dart 123:7 route
packages/flutter/src/gestures/binding.dart 440:19 handleEvent
packages/flutter/src/gestures/binding.dart 420:14 dispatchEvent
packages/flutter/src/rendering/binding.dart 278:11 dispatchEvent
packages/flutter/src/gestures/binding.dart 374:7 [_handlePointerEventImmediately]
packages/flutter/src/gestures/binding.dart 338:5 handlePointerEvent
packages/flutter/src/gestures/binding.dart 296:7 [_flushPointerEventQueue]
packages/flutter/src/gestures/binding.dart 279:32 [_handlePointerDataPacket]
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 1018:13 invoke1
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 182:5 invokeOnPointerDataPacket
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/pointer_binding.dart 130:39 [_onPointerData]
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/pointer_binding.dart 555:18
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/pointer_binding.dart 508:21
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/pointer_binding.dart 216:16 loggedHandler
Handler: "onTap"
Recognizer: TapGestureRecognizer#3fd62
debugOwner: GestureDetector
state: possible
won arena
finalPosition: Offset(250.4, 360.8)
finalLocalPosition: Offset(35.4, 25.6)
button: 1
sent tap down
====================================================================================================`

Attached you can find an example project which is showcasting the issue.

Do you have any advice?

Thank you and best regards,
Matthias
smart_dialog_test.zip

getx搭配使用问题

版本信息

  • Flutter版本:[举例:v2.8.1]
  • flutter_smart_dialog版本:[举例:v^3.4.2+2]

描述bug/需求

E/flutter ( 4769): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
E/flutter ( 4769): #0 new MonitorPopRoute._ (package:flutter_smart_dialog/src/helper/monitor_pop_route.dart:16:28)
E/flutter ( 4769): #1 MonitorPopRoute.instance (package:flutter_smart_dialog/src/helper/monitor_pop_route.dart:13:72)
E/flutter ( 4769): #2 FlutterSmartDialog.monitor (package:flutter_smart_dialog/src/dialog.dart:44:44)
E/flutter ( 4769): #3 FlutterSmartDialog.init (package:flutter_smart_dialog/src/dialog.dart:56:5)
E/flutter ( 4769): #4 main (package:getx_demo/main.dart:16:35)
E/flutter ( 4769): #5 _runMainZoned.. (dart:ui/hooks.dart:129:25)
E/flutter ( 4769): #6 _rootRun (dart:async/zone.dart:1428:13)
E/flutter ( 4769): #7 _CustomZone.run (dart:async/zone.dart:1328:19)
E/flutter ( 4769): #8 _runZoned (dart:async/zone.dart:1863:10)
E/flutter ( 4769): #9 runZonedGuarded (dart:async/zone.dart:1851:12)
E/flutter ( 4769): #10 _runMainZoned. (dart:ui/hooks.dart:125:5)
E/flutter ( 4769): #11 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:297:19)
E/flutter ( 4769): #12 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
E/flutter ( 4769):

问题demo

void main() {
runApp(
GetMaterialApp(
title: "Application",
initialRoute: AppPages.INITIAL,
getPages: AppPages.routes,
// here
navigatorObservers: [FlutterSmartDialog.observer],
// here
builder: FlutterSmartDialog.init(),
),
);
}

双击退出bug

双击退出会弹出toast,里面会调用下面的代码
_toastList.add(
_action.show(
widget: widget,
isPenetrate: true,
clickBgDismiss: false,
),
);
会设置到config.isExist = true; 所以判断的时候到不了退出逻辑,只有把退出间隔调大,等到toast消失马上再点击才能退出

Issue on initialization.

I am already using a builder function in MaterialApp which is for MediaQuery factors. When it is initialized on that builder function, it shows :

Unhandled Exception: LateInitializationError: Field 'toastBuilder' has not been initialized.
#0 DialogProxy.toastBuilder (package:flutter_smart_dialog/src/helper/dialog_proxy.dart)
#1 SmartDialog.showToast (package:flutter_smart_dialog/src/smart_dialog.dart:534:46)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.