是否可以显示 Flutter Web 链接的链接预览?

Kin*_* Pu 6 flutter flutter-web

我正在考虑在 flutter web 上开发一个电子商务应用程序,使用 Navigator 2.0,也许是 beamer。

我希望人们能够分享 flutter web 链接并在社交网络上显示预览。这可能吗?

只是为了澄清:我不想在我的网络应用程序上显示其他网站的预览。我想在社交网络上显示我的 flutter web 应用程序链接的预览。那可能吗?

Moh*_*san 3

Meta 标签是 html 文件的一部分,作为对“mata 标签预览解析器”的响应,Flutter 提供静态 html 文件 ( index.html) 和动态 js,

如果您只想包含所有请求的元数据响应,那么您只需修改 Web 源代码下的 index.html 文件即可。

但如果您需要根据用户所在的页面创建动态元数据,则需要为每个请求提供动态 html 页面,如下所示。

从我的尝试来看,我无法从 flutter 端做到这一点,但我必须修改每个请求的 html 响应,查看这篇文章: https: //almog.io/blog/dynamic-open-graph-元标签-flutter-web

我还包含了我的部分代码(它通过 firebase 托管托管):

exports.dynamicMetaTagsUpdate = functions.https.onRequest(async (request, response) => {

    let html = fs.readFileSync("./index.html", "utf8");
    let id = request.path.split("/").pop()

    try {
        let metaStart = html.indexOf("<!--  META TAGS START-->")
        let metaEnd = html.indexOf("META END")
        let start = html.substring(0, metaStart);
        let injected = await getMetatags(id);
        let end = html.substring(metaEnd, html.length);
        return response.send(start + injected + end);
    } catch (e) {
        console.log(e);
        return response.send(html);
    }
});
Run Code Online (Sandbox Code Playgroud)

js 函数getMetatags(id)是一个返回元集字符串的函数,我需要将其包含到响应 html 中,例如:

  <meta property="og:type" content="website">
  <meta property="og:title" content="${author}">
  <meta property="og:description" content="${description}">
  <meta property="og:image" content="${image}">

Run Code Online (Sandbox Code Playgroud)

结果 html 响应将如下所示:

<!DOCTYPE html>
<html>
<head>
 
    <base href="/">

    <meta charset="UTF-8">
    <meta content="IE=Edge" http-equiv="X-UA-Compatible">
    
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="apple-mobile-web-app-title" content="app name">
    <link rel="apple-touch-icon" href="icons/Icon-192.png">


    <!--  META TAGS START-->

    <title>app name</title>
    <meta name="description"
          content="1234 56789 0123">

    <!-- Google / Search Engine Tags -->
    <meta itemprop="name" content="app name">
    <meta itemprop="description"
          content="1234 56789 0123">
    <meta itemprop="image"
          content="https://website.com/image.jpeg">

    <!-- Facebook Meta Tags -->
    <meta property="og:url" content="https://website.com">
    <meta property="og:type" content="website">
    <meta property="og:title" content="app name">
    <meta property="og:description"
          content="1234 56789 0123">
    <meta property="og:image"
          content="https://website.com/image.jpeg">

    <!-- Twitter Meta Tags -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="app name">
    <meta name="twitter:description"
          content="1234 56789 0123">
    <meta name="twitter:image"
          content="https://website.com/image.jpeg">

    <!--  META TAGS END-->
    
    <link rel="icon" type="image/png" href="favicon.png"/>

    <link rel="manifest" href="manifest.json">

    <script>
        // The value below is injected by flutter build, do not touch.
        var serviceWorkerVersion = '4168871932';
    </script>
    <!-- This script adds the flutter initialization JS code -->
    <script src="flutter.js" defer></script>
</head>
<body>
<script>
    window.addEventListener('load', function (ev) {
        // Download main.dart.js
        _flutter.loader.loadEntrypoint({
            serviceWorker: {
                serviceWorkerVersion: serviceWorkerVersion,
            }
        }).then(function (engineInitializer) {
            return engineInitializer.initializeEngine();
        }).then(function (appRunner) {
            return appRunner.runApp();
        });
    });
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)