Flutter范围选择器插件reactive_range_slider的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter范围选择器插件reactive_range_slider的使用

reactive_range_slider 是一个用于 Flutter 的范围选择器插件,它基于 RangeSlider 类,并与 reactive_forms 插件结合使用。本文将展示如何在 Flutter 应用程序中使用该插件。

示例代码

以下是一个完整的示例,展示了如何使用 reactive_range_slider 插件。

import 'package:flutter/material.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:reactive_range_slider/reactive_range_slider.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 构建表单
  FormGroup buildForm() => fb.group({
        'input': FormControl<RangeValues>(value: const RangeValues(0, 10)),
      });

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    // 使用 ReactiveRangeSlider
                    ReactiveRangeSlider<RangeValues>(
                      formControlName: 'input',
                      min: 0,
                      max: 100,
                      divisions: 5,
                      labelBuilder: (values) => RangeLabels(
                        values.start.round().toString(),
                        values.end.round().toString(),
                      ),
                      decoration: const InputDecoration(
                        border: InputBorder.none,
                        contentPadding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                      ),
                      // step: 5,
                      // textStyle: const TextStyle(fontSize: 18),
                      // decoration: InputDecoration(
                      //   border: OutlineInputBorder(),
                      //   contentPadding: EdgeInsets.fromLTRB(12, 12, 0, 0),
                      //   labelText: "Search amount",
                      //   helperText: '',
                      // ),
                    ),
                    const SizedBox(height: 16),
                    ElevatedButton(
                      child: const Text('Sign Up'),
                      onPressed: () {
                        if (form.valid) {
                          // 打印表单值
                          print(form.value);
                        } else {
                          form.markAllAsTouched();
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的库:

    import 'package:flutter/material.dart';
    import 'package:reactive_forms/reactive_forms.dart';
    import 'package:reactive_range_slider/reactive_range_slider.dart';
    
  2. 构建表单:

    FormGroup buildForm() => fb.group({
          'input': FormControl<RangeValues>(value: const RangeValues(0, 10)),
        });
    

    这里我们创建了一个包含 FormControl<RangeValues> 的表单,初始值为 RangeValues(0, 10)

  3. 构建应用程序界面:

    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Scaffold(
          body: SafeArea(
            child: SingleChildScrollView(
              physics: const BouncingScrollPhysics(),
              padding: const EdgeInsets.symmetric(
                horizontal: 20.0,
                vertical: 20.0,
              ),
              child: ReactiveFormBuilder(
                form: buildForm,
                builder: (context, form, child) {
                  return Column(
                    children: [
                      // 使用 ReactiveRangeSlider
                      ReactiveRangeSlider<RangeValues>(
                        formControlName: 'input',
                        min: 0,
                        max: 100,
                        divisions: 5,
                        labelBuilder: (values) => RangeLabels(
                          values.start.round().toString(),
                          values.end.round().toString(),
                        ),
                        decoration: const InputDecoration(
                          border: InputBorder.none,
                          contentPadding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                        ),
                      ),
                      const SizedBox(height: 16),
                      ElevatedButton(
                        child: const Text('Sign Up'),
                        onPressed: () {
                          if (form.valid) {
                            // 打印表单值
                            print(form.value);
                          } else {
                            form.markAllAsTouched();
                          }
                        },
                      ),
                    ],
                  );
                },
              ),
            ),
          ),
        ),
      );
    }
    

更多关于Flutter范围选择器插件reactive_range_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter范围选择器插件reactive_range_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用reactive_range_slider插件的示例代码。这个插件允许你创建一个范围选择器(Range Slider),用户可以选择一个数值范围。

首先,确保你已经在pubspec.yaml文件中添加了reactive_range_slider依赖:

dependencies:
  flutter:
    sdk: flutter
  reactive_forms: ^10.0.0  # 根据最新版本调整
  reactive_range_slider: ^x.x.x  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

以下是一个完整的示例代码,展示如何在Flutter应用中使用reactive_range_slider

import 'package:flutter/material.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:reactive_range_slider/reactive_range_slider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final formGroup = FbGroup();

  @override
  Widget build(BuildContext context) {
    formGroup.addControl(
      'range',
      FbControl<List<double>>([0.0, 100.0]), // 初始值范围
    );

    return Scaffold(
      appBar: AppBar(
        title: Text('Reactive Range Slider Example'),
      ),
      body: ReactiveForm(
        formGroup: formGroup,
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ReactiveRangeSlider<double>(
                formControlName: 'range',
                min: 0.0,
                max: 100.0,
                divisions: 10,
                labels: RangeLabels(
                  '${formGroup.control('range')?.value?.first ?? 0.0}',
                  '${formGroup.control('range')?.value?.last ?? 100.0}',
                ),
                onChangeEnd: (value) {
                  print('Selected range: $value');
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  final range = formGroup.control('range')?.value;
                  if (range != null) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text(
                          'Selected range: ${range.first.toStringAsFixed(1)} - ${range.last.toStringAsFixed(1)}',
                        ),
                      ),
                    );
                  }
                },
                child: Text('Show Selected Range'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 依赖导入:导入flutter, reactive_forms, 和 reactive_range_slider包。
  2. 表单组创建:在MyHomePage类中创建一个FbGroup实例来管理表单控件。
  3. 表单控件添加:使用addControl方法添加一个范围控件,初始值设为[0.0, 100.0]
  4. ReactiveForm包裹:使用ReactiveForm包裹整个表单内容,并传入formGroup
  5. ReactiveRangeSlider:使用ReactiveRangeSlider创建范围选择器,绑定到表单控件range,并设置最小值、最大值和刻度。
  6. 标签显示:使用labels参数显示当前选中的范围值。
  7. 值变化处理onChangeEnd回调用于处理范围选择结束后的值变化。
  8. 按钮显示选中范围:通过点击按钮显示当前选中的范围值。

这个示例展示了如何使用reactive_range_slider来创建一个可交互的范围选择器,并将其值绑定到reactive_forms表单控件中。希望这个示例对你有所帮助!

回到顶部