18

嗨,我是一名移动应用程序开发人员,对 Web 开发不太熟悉,在加载诸如 Gmail 加载屏幕之类的颤振 Web 应用程序之前,我正在寻找任何方法来实现进度指示器。Flutter web 很酷,但在加载应用程序之前需要一些时间。我们可以为这个加载持续时间添加任何指标吗?任何在颤振中实现的代码都将是颤振应用程序的一部分,它不会工作,应该有另一种方法来实现这一点。

4

6 回答 6

26

在@Abhilash 的帮助下,我能够做到这一点。我从w3schools获得了加载程序代码。

project/web/index.html的是这样的。

<html>

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script defer src="index.dart.js" type="application/javascript"></script>

  <style>
    .loading {
      display: flex;
      justify-content: center;
      align-items: center;
      margin: 0;
      position: absolute;
      top: 50%;
      left: 50%;
      -ms-transform: translate(-50%, -50%);
      transform: translate(-50%, -50%);
    }
    
    .loader {
      border: 16px solid #f3f3f3;
      border-radius: 50%;
      border-top: 16px solid blue;
      border-right: 16px solid green;
      border-bottom: 16px solid red;
      border-left: 16px solid pink;
      width: 120px;
      height: 120px;
      -webkit-animation: spin 2s linear infinite;
      animation: spin 2s linear infinite;
    }
    
    @-webkit-keyframes spin {
      0% {
        -webkit-transform: rotate(0deg);
      }
      100% {
        -webkit-transform: rotate(360deg);
      }
    }
    
    @keyframes spin {
      0% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }
  </style>
</head>

<body>
  <div class="loading">
    <div class="loader"></div>
  </div>

  <script src="main.dart.js" type="application/javascript"></script>
</body>

</html>

于 2020-02-01T18:15:10.437 回答
10

在你提到的问题中

在颤振中实现的任何代码都将是颤振应用程序的一部分,它不会工作,......

我假设您尝试为 android 或 IOS 添加启动屏幕方法。由于 flutter-web 只是一个index.html和几个 js 文件(例如,main.dart.js),您或许应该尝试CSS加载动画技巧。由于您没有共享任何代码,因此我没有编写任何代码,但以下是我的方法,正如这个红色订书机视频所解释的那样。他/她在这里提供了许多CSS基于动画的动画以及为此的 codepen 实现。

因此,以下将是我在flutter_web_project\web\index.html文件中的步骤。

  1. 在 body 中添加一个span元素index.html来显示css动画本身。
  2. 创建一个div包装器以将跨度动画定位在您的index.html.
  3. 然后收听onLoad窗口的事件并从页面中删除div元素或将其淡出,如视频中所述。
于 2019-08-19T09:13:11.880 回答
8

除了@Shahzad Akram 的回答之外,您还应该删除,loading div因为在 Safari 浏览器中它可能会导致闪烁。因此,在第一个屏幕中,您需要实现以下代码(例如,在initState方法中):

import 'package:universal_html/html.dart'

...

@override
void initState() {
  super.initState()
  // Remove `loading` div
  final loader = document.getElementsByClassName('loading');
  if(loader.isNotEmpty) {
    loader.first.remove();
  }
}

PS 对于不错的加载器,您可以访问loading.io

于 2020-09-17T07:41:26.983 回答
3

如果您想仅使用 JS 删除加载 div,请使用此代码

  <script>
    window.onload = (event) => {
      console.log('page is fully loaded');
      var element = document.getElementById("loader");
      element.parentNode.removeChild(element);
    };
  </script>

请注意,它假定 loader 是一个<div id="loader"></div>标签

于 2021-07-14T06:09:43.893 回答
3

Adam's answer will remove loader before flutter is actually loaded.

I found this script to be the most complete answer:

<html>
<head>
  <style>
        .loading {
          display: flex;
          flex-flow: column;
          justify-content: center;
          align-items: center;
          margin: 0;
          position: absolute;
          top: 50%;
          left: 50%;
          -ms-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
        }

        .loader {
          border: 8px solid #f3f3f3;
          border-radius: 50%;
          border-top: 8px solid #00AD87;
          border-right: 8px solid #C30E48;
          border-bottom: 8px solid #00AD87;
          border-left: 8px solid #C30E48;
          width: 60px !important;
          height: 60px !important;
          -webkit-animation: spin 2s linear infinite;
          animation: spin 2s linear infinite;
        }

        @-webkit-keyframes spin {
          0% {
            -webkit-transform: rotate(0deg);
          }
          100% {
            -webkit-transform: rotate(360deg);
          }
        }

        @keyframes spin {
          0% {
            transform: rotate(0deg);
          }
          100% {
            transform: rotate(360deg);
          }
        }
  </style>
</head>

<body>

  <!-- First time loading -->
  <div class="loading">
      <div class="loader"></div>
  </div>

  <!-- Ensure first time loading progress is gone after app loads -->
  <script>
      window.addEventListener("flutter-first-frame", function() {
          var element = document.getElementsByClassName("loading");
          element[0].parentNode.removeChild(element[0]);
      });
  </script>

<script defer src="main.dart.js" type="application/javascript"</script>

</body>
</html>
于 2022-01-17T07:14:51.307 回答
1

除了@Shahzad 和@BambinoUA 的回答之外,我还需要为 main.dart.js 脚本标签添加defer关键字。

<script defer src="main.dart.js" type="application/javascript"></script>

以下是我需要这样做的场景:

  • 应用程序托管在 Gitlab 页面上
  • 浏览器是 Chrome(网速很慢)

在这种情况下,在下载整个脚本之前,只能看到空白屏幕。然后动画仅可见 0.5 秒,然后立即加载颤振小部件。因此未能达到加载动画的目的。这在本地测试中不会发生。

我还尝试将动画 div 放在所有脚本之前,但没有帮助。

于 2021-07-26T13:11:11.570 回答