Flutter问卷调查插件survey_flow的使用

Flutter问卷调查插件survey_flow的使用

概述

Survey Flow 是一个用于在 Flutter 应用中创建调查或测验的插件。它允许你轻松定义调查结构并自定义其外观,并且包含一系列预构建的小部件来帮助你显示问题并收集用户响应。

示例

自定义设计 + 底部弹出框

安装

要将 Survey Flow 添加到你的 Flutter 应用中,请将其添加到 pubspec.yaml 文件中:

dependencies:
  survey_flow: ^latest_version

然后运行 flutter pub get 下载包。

使用

要使用 Survey Flow,请在 Dart 代码中导入该包:

import 'package:survey_flow/survey_flow.dart';

创建调查

要创建调查,可以使用 SurveyStep 类之一或创建自己的类:

final List<SurveyStep> steps = [
   InformationStep(
      title: '信息标题',
      description: '描述信息',
      image: StepImage.svg(
         'https://www.svgrepo.com/show/24762/round-done-button.svg',
         source: StepImageSource.network,
         width: 0.3,
      ),
      primaryButton: StepButton(
         action: 'action:notificationsPermission',
         text: '下一步',
      ),
   ),
];

显示调查

要显示调查,使用 SurveyFlow 小部件:

class MySurveyScreen extends StatefulWidget {
   @override
   _MySurveyScreenState createState() => _MySurveyScreenState();
}

class _MySurveyScreenState extends State<MySurveyScreen> {
   final List<SurveyStep> survey = // 创建你的调查

   @override
   Widget build(BuildContext context) {
      return Scaffold(
         appBar: AppBar(title: Text('我的调查')),
         body: SurveyFlow(
            initialSteps: survey,
            onSubmit: (results) {
               // 处理调查结果
            },
            onFinish: () {
               // 处理调查完成
            },
         ),
      );
   }
}

在这个示例中,我们创建了一个显示 SurveyFlow 小部件的屏幕,其中包含我们的 SurveyStep,当用户提交最后一个步骤或某些步骤具有 submit 动作时,将调用 onSubmit 回调(你可以在这里查看动作的工作方式),并且当用户完成调查时将调用 onFinish 回调。

显示模态调查

要显示模态调查,使用 showModalSurveyFlow 函数:

final List<SurveyStep> survey = // 创建你的调查

showModalSurveyFlow(
   context: context,
   initialSteps: survey, 
   onSubmit: (results) {
      // 处理调查结果
   },
   onFinish: () {
      // 处理调查完成
   },
);

预定义的步骤类型

信息步骤 (InformationStep)

InformationStep(
   title: '信息标题',
   description: '描述信息',
   image: StepImage.svg(
      'https://www.svgrepo.com/show/24762/round-done-button.svg',
      source: StepImageSource.network,
      width: 0.3,
   ),
   primaryButton: StepButton.next(),
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
description Null 步骤描述。
image Null 步骤图像。
backgroundImage Null 背景图像。
primaryButton StepButton.next() 主按钮。
secondaryButton Null 辅助按钮。
buttonsAlignment ButtonsAlignment.vertical 按钮对齐方式 - 垂直或水平。

单选步骤 (SingleSelectStep)

SingleSelectStep(
  title: '选择一个选项以继续',
  description: '描述信息',
  options: [
     SelectOption(
        text: '自定义导航选项',
        description: '如果你选择此选项,下一个步骤将是 number_request_step',
        value: 'option_1',
        navigationConditions: [
           ButtonNavigationCondition(
            nextStepId: 'number_request_step',
           ),
        ],
    ),
     SelectOption(
        text: '通知权限',
        value: 'option_2',
        action: 'action:notificationsPermission',
     ),
     SelectOption(
        text: '选项 3',
        description: '选项描述',
        value: 'option_3',
     ),
     SelectOption(
        text: '选项 4',
        value: 'option_4',
     ),
  ],
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
options required 选项列表。
description Null 步骤描述。
backgroundImage Null 背景图像。
primaryButton StepButton.next() 主按钮。

多选步骤 (MultiSelectStep)

MultiSelectStep(
   title: '请选择 1 到 2 个选项以继续',
   description: '描述信息',
   minimumAmountOfOptionsSelected: 1,
   maximumAmountOfOptionsSelected: 2,
   options: [
      SelectOption(
         text: '选项 1',
         description: '选项描述',
         value: 'option_1',
      ),
      SelectOption(
         text: '选项 2',
         value: 'option_2',
      ),
      SelectOption(
         text: '选项 3',
         description: '选项描述',
         value: 'option_3',
      ),
      SelectOption(
         text: '选项 4',
         value: 'option_4',
      ),
   ],
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
options required 选项列表。
description Null 步骤描述。
backgroundImage Null 背景图像。
primaryButton StepButton.next() 主按钮。
minimumAmountOfOptionsSelected Null 最小选项数以启用按钮。
maximumAmountOfOptionsSelected Null 最大选项数。

数字请求步骤 (NumberRequestStep)

NumberRequestStep(
   id: 'number_request_step',
   title: '数字请求标题',
   description: '描述信息',
   hint: '请输入年龄',
   primaryButton: StepButton.next(
      predicate: ButtonPredicate.moreThan(18),
   ),
   secondaryButton: StepButton.skip(),
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
description Null 步骤描述。
primaryButton StepButton.next() 主按钮。
secondaryButton Null 辅助按钮。
buttonsAlignment ButtonsAlignment.vertical 按钮对齐方式 - 垂直或水平。
hint Null 文本字段提示。
type RequestType.numberInt 请求数据类型。

文本请求步骤 (TextRequestStep)

TextRequestStep(
   title: '文本请求标题',
   description: '描述信息',
   hint: '请输入姓名',
   primaryButton: StepButton.next(),
   secondaryButton: StepButton.skip(),
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
description Null 步骤描述。
primaryButton StepButton.next() 主按钮。
secondaryButton Null 辅助按钮。
hint Null 文本字段提示。
type RequestType.text 请求数据类型。

日期请求步骤 (DateRequestStep)

DateRequestStep(
   title: '日期请求标题',
   description: '描述信息',
   hint: '请输入出生日期',
   primaryButton: StepButton.next(),
);
参数 默认值 描述
id Null 步骤 ID。可用于自定义步骤导航。
title required 步骤标题。
description Null 步骤描述。
primaryButton StepButton.next() 主按钮。
secondaryButton Null 辅助按钮。
hint Null 文本字段提示。
dateFormat Null 默认为 ‘d MMMM yyyy’ 对于日期,‘hh:mm’ 对于时间,‘d MMM yyyy hh:mm’ 对于日期时间。
type RequestType.date 请求数据类型。

自定义步骤 (Custom Step)

class CustomSurveyStep implements SurveyStep {
   const CustomSurveyStep({
      required this.id,
      required this.title,
      required this.description,
      required this.primaryButton,
      required this.image,
      this.backgroundImage,
   });

   @override
   final String id;

   @override
   final String title;

   @override
   final String description;

   @override
   final StepImage? backgroundImage;

   final StepImage image;
   final StepButton primaryButton;
}

你可以通过继承 SurveyStep 来创建自己的步骤,并为其添加自定义的小部件处理程序。想象力是唯一的限制 ☺️

请求类型 (RequestType)

enum RequestType {
  text,
  textMultiline,
  name,
  email,
  numberInt,
  numberDouble,
  date,
  time,
  dateAndTime,
}

步骤按钮 (StepButton)

参数 默认值 描述
id Null 按钮 ID。
text required 按钮标题。
action required 按钮动作。
style StepButtonStyle.elevated 按钮样式 - 抬起、轮廓或文本。
type StepButtonType.primary 按钮类型 - 主按钮或次按钮。
navigationConditions Null 导航条件。
predicate Null 使按钮启用或禁用的谓词。
enum StepButtonType { primary, secondary }
enum StepButtonStyle { elevated, outlined, text }

按钮谓词 (ButtonPredicate)

ButtonPredicate.moreThan(18);
参数 默认值 描述
type required 谓词类型。
value Null 用于比较的值。
enum ButtonPredicateType {
   notEmpty,
   lengthMoreThan,
   matches,
   equals,
   lessThan,
   moreThan,
}

按钮导航条件 (ButtonNavigationCondition)

ButtonNavigationCondition.moreThan('my_step_id', 18);
参数 默认值 描述
type ButtonNavigationConditionType.nextStep 导航条件类型。
nextStepId required 打开的步骤 ID。
value Null 用于比较的值。
enum ButtonNavigationConditionType {
   nextStep,
   notEmpty,
   lengthMoreThan,
   matches,
   equals,
   lessThan,
   moreThan,
}

选择选项 (SelectOption)

SelectOption(
   text: '选项标题',
   value: '选项值',
   description: '选项描述',
   action: 'action:next',
);
参数 默认值 描述
id Null 按钮 ID。
text required 按钮标题。
value required 选项值。
description Null 步骤描述。
action StepActions.next 按钮动作。
navigationConditions Null 导航条件。

步骤图像 (StepImage)

StepImage.svg(
   'assets/badge.svg',
   source: StepImageSource.local,
   position: ImagePosition(right: 0.0, top: 0.0),
)
参数 默认值 描述
path required 图像路径。
source required 图像源。
type required 图像类型。
width Null 图像宽度。
height Null 图像高度。
position Null 图像位置。
opacity 1.0 图像不透明度。
enum StepImageSource {
  local,
  network,
}
enum StepImageType {
   image,
   svg,
   lottie,
}

调查主题数据 (SurveyFlowThemeData)

你可以使用 SurveyFlowThemeDataSurveyFlow 小部件设置自己的样式。

JSON序列化

你可以使用 JSON 提供调查步骤。每个模型都支持 JSON 序列化。

这意味着你可以使用 Firebase Remote Config、本地 JSON、你的后端或其他服务动态更改调查,而无需更新应用程序。

// 如果你有自己的步骤,请添加转换器
stepsConverters.addAll({
  'customStep': (v) => CustomSurveyStep.fromJson(v),
});

final String initialStepsData = await rootBundle.loadString("assets/initial_steps.json");
final List<dynamic> initialStepsDecoded = jsonDecode(initialStepsData);

// 使用 SurveyStepConverter 从 JSON 转换模型
// 你可以直接在模型中使用注解。
final List<SurveyStep> initialSteps = initialStepsDecoded
        .map((e) => const SurveyStepConverter().fromJson(e as Map<String, dynamic>?))
        .toList();
[
   {
      "id": "information_svg_step",
      "stepType": "information",
      "title": "信息标题",
      "description": "描述信息",
      "image": {
         "path": "https://www.svgrepo.com/show/24762/round-done-button.svg",
         "source": "network",
         "type": "svg",
         "width": 0.3
      },
      "primaryButton": {
         "action": "action:showBottomSheetSurvey",
         "text": "下一步"
      }
   }
]

更多关于Flutter问卷调查插件survey_flow的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter问卷调查插件survey_flow的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于如何在Flutter项目中使用survey_flow插件来创建一个问卷调查,以下是一个基本的代码示例。survey_flow是一个用于在Flutter应用中实现问卷和调查流的插件。以下示例将展示如何初始化、配置和展示一个简单的问卷调查。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加survey_flow的依赖:

dependencies:
  flutter:
    sdk: flutter
  survey_flow: ^最新版本号  # 请替换为实际可用的最新版本号

2. 导入包

在你的Dart文件中(例如main.dart),导入survey_flow包:

import 'package:flutter/material.dart';
import 'package:survey_flow/survey_flow.dart';

3. 配置问卷数据

定义一个问卷的数据结构,包括问题、选项等:

final List<SurveyStep> surveySteps = [
  SurveyStep(
    id: "step1",
    title: "你的年龄是?",
    content: "请选择你的年龄范围",
    options: [
      SurveyOption(id: "18-24", text: "18-24"),
      SurveyOption(id: "25-34", text: "25-34"),
      SurveyOption(id: "35-44", text: "35-44"),
      SurveyOption(id: "45+", text: "45+"),
    ],
    isRequired: true,
  ),
  SurveyStep(
    id: "step2",
    title: "你对我们的服务满意吗?",
    content: "请选择你的满意度",
    options: [
      SurveyOption(id: "very_satisfied", text: "非常满意"),
      SurveyOption(id: "satisfied", text: "满意"),
      SurveyOption(id: "neutral", text: "一般"),
      SurveyOption(id: "dissatisfied", text: "不满意"),
      SurveyOption(id: "very_dissatisfied", text: "非常不满意"),
    ],
    isRequired: true,
  ),
  // 可以添加更多步骤
];

4. 创建SurveyFlow

使用SurveyFlow小部件来展示问卷:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('问卷调查示例'),
        ),
        body: SurveyFlow(
          steps: surveySteps,
          onComplete: (result) {
            // 处理问卷完成后的结果
            print("问卷结果: $result");
            // 例如,你可以将结果保存到数据库或发送到服务器
          },
          onCancel: () {
            // 处理取消操作
            print("问卷被取消");
          },
          // 你可以自定义样式和行为
          surveyFlowStyle: SurveyFlowStyle(
            // 自定义样式
          ),
        ),
      ),
    );
  }
}

5. 运行应用

确保你的开发环境已经设置好,并且所有依赖都已安装。然后运行你的Flutter应用:

flutter run

总结

上述代码示例展示了如何在Flutter项目中使用survey_flow插件来创建一个简单的问卷调查。你可以根据实际需求调整问卷的步骤、选项和样式。survey_flow插件提供了丰富的配置选项,可以帮助你实现复杂的问卷逻辑和用户体验。

希望这个示例对你有所帮助!如果你有更具体的问题或需要进一步的帮助,请随时提问。

回到顶部