Flutter--确认、加载复合状态弹窗

133 阅读1分钟
static Future<bool?> showAlertDialog({
  required BuildContext context,
  String? title,
  String? content,
  String? okText,
  String? loadingTitle,
  String? loadingSubTitle,
  String? errorText,
  Future<bool> Function()? onConfirmed,
}) async {
  return await showDialog<bool>(
    context: context,
    builder: (ctx) {
      bool isOk = false;
      // TODO:多语言
      return StatefulBuilder(
          builder: (BuildContext context, StateSetter setState) {
        if (isOk) {
          return AlertDialog(
            title: Text(loadingTitle ?? "正在加载"),
            content: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                const SizedBox(height: 16),
                const SizedBox(
                  width: 24,
                  height: 24,
                  child: CircularProgressIndicator(
                    strokeWidth: 3,
                  ),
                ), // 添加一个加载指示器
                const SizedBox(height: 16),
                Text(loadingSubTitle ?? '请等待...'), // 提示用户等待
              ],
            ),
          );
        } else {
          return AlertDialog(
            title: title != null ? Text(title) : null,
            content: content != null
                ? Text(
                    content,
                    style: const TextStyle(height: 1.6),
                  )
                : null,
            actions: [
              FilledButton.tonal(
                onPressed: () {
                  AppNavigator.pop(ctx);
                },
                child: Text(S.of(ctx).cancel),
              ),
              FilledButton(
                onPressed: () async {
                  setState(() {
                    isOk = true;
                  });
                  if (onConfirmed != null) {
                    onConfirmed().then((value) {
                      if (value) {
                        AppNavigator.pop<bool>(ctx, result: value);
                      } else {
                        // 没有的话将UI恢复,并提醒失败
                        setState(() {
                          isOk = false;
                        });
                        AppDialog.showSnackBar(ctx, errorText ?? "处理失败请重试");
                      }
                    });
                  } else {
                    AppNavigator.pop<bool>(ctx, result: true);
                  }
                },
                child: Text(okText ?? S.of(ctx).confirm),
              ),
            ],
          );
        }
      });
    },
  );
}