Flutter数字计数插件count_number的使用

Flutter数字计数插件count_number的使用

count_number 插件用于实现一个基于弹簧模拟的数值动画效果。它通过内部周期性定时器检查模拟状态,并在必要时调用相应的回调函数。该值可以是整数或双精度浮点数。

特性

  • 动画化地增加或减少数值。
  • 支持整数和浮点数。
  • 只在实际需要时调用回调函数。
  • 可以初始化为动态。
  • 设置 value 属性将触发新的计数过程。

开始使用

添加依赖

pubspec.yaml 文件中添加以下依赖:

flutter pub add count_number

导入包

在 Dart 文件中导入 count_number 包:

import 'package:count_number/count_number.dart';

使用示例

初始化 CountNumber 对象

class _HomeState extends State<Home> {
  num _number = 0;
  bool _isNumActive = true;
  late CountNumber _countNumber;
  late TextEditingController _txtController;

  [@override](/user/override)
  void initState() {
    _txtController = TextEditingController(text: '0');
    _countNumber = CountNumber(
      endValue: _number,
      onUpdate: onCountUpdate,
      onDone: onCountDone,
      isDynamic: true,
    );
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    _countNumber.stop();
    _txtController.dispose();
    super.dispose();
  }

  void onCountUpdate(num value) {
    setState(() => _number = value);
  }

  void onCountDone() {
    setState(() => _isNumActive = true);
  }

  void _onPressed() {
    if (_isNumActive) {
      num? newVal = num.tryParse(_txtController.text);
      if (newVal != null) {
        _isNumActive = false;
        _countNumber.value = newVal;
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(
              child: Center(
            child: Text(
              CountNumber.isInteger(_number)
                  ? _number.toString()
                  : _number.toStringAsFixed(2),
              style: Theme.of(context).textTheme.headline1,
            ),
          )),
          Card(
            elevation: 12,
            margin: const EdgeInsets.symmetric(
              vertical: 30,
              horizontal: 20,
            ),
            child: Row(
              children: [
                const SizedBox(
                  width: 15,
                ),
                Expanded(
                  flex: 2,
                  child: Padding(
                    padding: const EdgeInsets.symmetric(
                      vertical: 5,
                      horizontal: 20,
                    ),
                    child: TextField(
                      controller: _txtController,
                      enabled: _isNumActive,
                      keyboardType: TextInputType.number,
                      textAlign: TextAlign.center,
                      onSubmitted: (_) => _onPressed(),
                      style: Theme.of(context).textTheme.headline4?.copyWith(
                            fontWeight: FontWeight.w200,
                          ),
                      decoration: const InputDecoration(
                        fillColor: Colors.white70,
                        filled: true,
                        contentPadding: EdgeInsets.all(10),
                        border: OutlineInputBorder(
                            borderRadius: BorderRadius.all(Radius.circular(10)),
                            borderSide: BorderSide(
                              color: Colors.cyan,
                            )),
                      ),
                    ),
                  ),
                ),
                const Spacer(),
                TextButton(
                  onPressed: _onPressed,
                  child: const Text('Count!'),
                ),
                const SizedBox(
                  width: 15,
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

运行计数

build 方法中调用 _countNumber.start() 方法启动计数动画:

[@override](/user/override)
Widget build(BuildContext context) {
  _countNumber.start();

  return Scaffold(
    appBar: AppBar(
      title: Text(widget.title),
    ),
    body: Column(
      children: [
        Expanded(
            child: Center(
          child: Text(
            CountNumber.isInteger(_number)
                ? _number.toString()
                : _number.toStringAsFixed(2),
            style: Theme.of(context).textTheme.headline1,
          ),
        )),
        Card(
          elevation: 12,
          margin: const EdgeInsets.symmetric(
            vertical: 30,
            horizontal: 20,
          ),
          child: Row(
            children: [
              const SizedBox(
                width: 15,
              ),
              Expanded(
                flex: 2,
                child: Padding(
                  padding: const EdgeInsets.symmetric(
                    vertical: 5,
                    horizontal: 20,
                  ),
                  child: TextField(
                    controller: _txtController,
                    enabled: _isNumActive,
                    keyboardType: TextInputType.number,
                    textAlign: TextAlign.center,
                    onSubmitted: (_) => _onPressed(),
                    style: Theme.of(context).textTheme.headline4?.copyWith(
                          fontWeight: FontWeight.w200,
                        ),
                    decoration: const InputDecoration(
                      fillColor: Colors.white70,
                      filled: true,
                      contentPadding: EdgeInsets.all(10),
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(10)),
                          borderSide: BorderSide(
                            color: Colors.cyan,
                          )),
                    ),
                  ),
                ),
              ),
              const Spacer(),
              TextButton(
                onPressed: _onPressed,
                child: const Text('Count!'),
              ),
              const SizedBox(
                width: 15,
              ),
            ],
          ),
        )
      ],
    ),
  );
}

更多关于Flutter数字计数插件count_number的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


count_number 是一个 Flutter 插件,用于在应用程序中实现数字计数动画效果。它可以帮助你创建从起始值到结束值的平滑过渡动画。以下是如何使用 count_number 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  count_number: ^0.1.0  # 请确保使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 count_number 包:

import 'package:count_number/count_number.dart';

3. 使用 CountNumber 组件

你可以使用 CountNumber 组件来创建数字计数动画。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Count Number Example'),
        ),
        body: Center(
          child: CountNumber(
            begin: 0,  // 起始值
            end: 100,  // 结束值
            duration: Duration(seconds: 3),  // 动画持续时间
            style: TextStyle(
              fontSize: 48,
              fontWeight: FontWeight.bold,
              color: Colors.blue,
            ),
          ),
        ),
      ),
    );
  }
}

4. 自定义参数

CountNumber 组件提供了多个参数,允许你自定义计数动画的行为和外观:

  • begin: 计数的起始值(默认值为 0)。
  • end: 计数的结束值(默认值为 100)。
  • duration: 动画的持续时间(默认值为 Duration(seconds: 2))。
  • style: 文本样式,可以自定义字体大小、颜色等。
  • curve: 动画曲线(默认值为 Curves.linear)。
  • separator: 分隔符,用于格式化数字(例如 ,.)。
  • decimalPlaces: 小数位数(默认值为 0)。

5. 高级用法

你还可以通过 CountNumberController 来控制计数动画的启动、暂停和重置。以下是一个使用控制器的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Count Number with Controller'),
        ),
        body: CountNumberExample(),
      ),
    );
  }
}

class CountNumberExample extends StatefulWidget {
  [@override](/user/override)
  _CountNumberExampleState createState() => _CountNumberExampleState();
}

class _CountNumberExampleState extends State<CountNumberExample> {
  final CountNumberController _controller = CountNumberController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        CountNumber(
          begin: 0,
          end: 100,
          duration: Duration(seconds: 3),
          controller: _controller,
          style: TextStyle(
            fontSize: 48,
            fontWeight: FontWeight.bold,
            color: Colors.blue,
          ),
        ),
        SizedBox(height: 20),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => _controller.start(),
              child: Text('Start'),
            ),
            SizedBox(width: 20),
            ElevatedButton(
              onPressed: () => _controller.pause(),
              child: Text('Pause'),
            ),
            SizedBox(width: 20),
            ElevatedButton(
              onPressed: () => _controller.reset(),
              child: Text('Reset'),
            ),
          ],
        ),
      ],
    );
  }
}
回到顶部