loading<T> function

Future<T> loading <T>(
  1. BuildContext context,
  2. Future<T> futureTask,
  3. {bool cancelable: true}
)

等待页

Implementation

Future<T> loading<T>(
  BuildContext context,
  Future<T> futureTask, {
  bool cancelable = true,
}) {
  // 是被future pop的还是按返回键pop的
  bool popByFuture = true;

  showDialog(
    context: context,
    builder: (context) {
      return WillPopScope(
        onWillPop: () async => cancelable,
        child: LoadingWidget(),
      );
    },
    barrierDismissible: cancelable,
  ).whenComplete(() {
    // 1. 如果是返回键pop的, 那么设置成true, 这样future完成时就不会pop了
    // 2. 如果是future完成导致的pop, 那么这一行是没用任何作用的
    popByFuture = false;
  });
  return futureTask.whenComplete(() {
    // 由于showDialog会强制使用rootNavigator, 所以这里pop的时候也要用rootNavigator
    if (popByFuture) {
      Navigator.of(context, rootNavigator: true).pop(context);
    }
  });
}