You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中生成可分享的问卷填写链接?

Flutter实现问卷分享链接功能方案

1. 生成唯一问卷标识

每次用户创建自定义问卷后,生成一个唯一ID关联问卷数据,推荐用uuid包实现:

import 'package:uuid/uuid.dart';

final uuidGenerator = Uuid();
String questionnaireId = uuidGenerator.v4(); // 生成全局唯一ID

将该ID与问卷的问题、配置等数据绑定,存储到后端数据库(跨设备访问场景)或本地存储(仅限本地测试)。

2. 构建可访问的问卷链接

根据部署场景选择对应链接格式:

  • 有后端服务:采用域名+ID的形式,例如 https://your-server.com/fill?id=${questionnaireId},后端通过ID查询对应问卷数据返回给前端。
  • 纯本地/局域网场景:使用http_server包启动本地HTTP服务,链接格式为 http://[你的本地IP]:8080/fill?id=${questionnaireId},本地服务根据ID读取存储的问卷数据。
  • 无后端轻量方案:将问卷数据Base64编码后放入链接参数(仅适用于数据量小的问卷):
import 'dart:convert';
import 'dart:typed_data';

String encodeQuestionnaire(Map<String, dynamic> questionnaireData) {
  final jsonStr = jsonEncode(questionnaireData);
  final bytes = utf8.encode(jsonStr);
  return base64UrlEncode(bytes);
}

// 生成带编码数据的链接
String shareLink = 'my-questionnaire://fill?data=${encodeQuestionnaire(yourQuestionnaireData)}';

3. 实现一键分享功能

借助share_plus包实现系统级分享,支持分享至社交平台、短信等渠道:

import 'package:share_plus/share_plus.dart';

void shareLinkToOthers(String link) {
  Share.share('请完成这份问卷:$link', subject: '问卷填写邀请');
}

// 按钮触发分享逻辑
ElevatedButton(
  onPressed: () => shareLinkToOthers(shareLink),
  child: const Text('分享问卷'),
)

4. 受访者端接收链接并加载问卷

如果使用自定义Scheme(如my-questionnaire://),需配置deeplink并监听跳转:

  • Android:在AndroidManifest.xml的主Activity中添加intent-filter:
<activity android:name=".MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="my-questionnaire" />
  </intent-filter>
</activity>
  • iOS:在Info.plist中添加URL Scheme配置:
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>my-questionnaire</string>
    </array>
  </dict>
</array>

监听链接并解析

使用uni_links包监听链接跳转,解析参数后加载问卷:

import 'package:uni_links/uni_links.dart';
import 'dart:convert';
import 'dart:typed_data';

void initLinkListener() async {
  // 处理App启动时的初始链接
  final initialUri = await getInitialUri();
  if (initialUri != null) _handleLink(initialUri);
  
  // 监听App运行中的链接跳转
  uriLinkStream.listen((uri) {
    if (uri != null) _handleLink(uri);
  });
}

void _handleLink(Uri uri) {
  if (uri.path == '/fill') {
    // 方式1:从后端获取问卷数据
    final questionnaireId = uri.queryParameters['id'];
    if (questionnaireId != null) {
      // 调用后端接口获取数据并渲染问卷UI
    }

    // 方式2:解码链接中的Base64数据
    final encodedData = uri.queryParameters['data'];
    if (encodedData != null) {
      final bytes = base64UrlDecode(encodedData);
      final questionnaireData = jsonDecode(utf8.decode(bytes));
      // 根据解码数据渲染问卷UI
    }
  }
}

内容的提问来源于stack exchange,提问作者omolola adeyemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:10:32