如何在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并监听跳转:
配置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
相关产品推荐
相关产品推荐

