Flutter控制功能插件control的使用

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

Flutter控制功能插件 control 的使用

control 是一个用于 Flutter 应用的状态管理插件,提供了简洁且强大的状态管理机制。本文将介绍如何安装和使用这个插件,并提供一个完整的示例 demo。

安装

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

dependencies:
  control: <version>

请确保替换 <version> 为最新的版本号,可以从 Pub.dev 获取最新版本信息。

示例代码

下面是一个完整的示例,展示了如何使用 control 插件来实现一个简单的计数器应用。

主函数

import 'dart:async';
import 'package:control/control.dart';
import 'package:flutter/material.dart';
import 'package:l/l.dart';

void main() => runZonedGuarded<Future<void>>(
      () async {
        // 设置控制器观察者
        Controller.observer = const ControllerObserver();
        runApp(const App());
      },
      (error, stackTrace) => l.e('Top level exception: $error', stackTrace),
    );

控制器定义

/// Counter state for [CounterController]
typedef CounterState = ({int count, bool idle});

/// Counter controller
final class CounterController extends StateController<CounterState>
    with SequentialControllerHandler {
  CounterController({CounterState? initialState})
      : super(initialState: initialState ?? (idle: true, count: 0));

  void add(int value) => handle(() async {
        setState((idle: false, count: state.count));
        await Future<void>.delayed(const Duration(milliseconds: 1500));
        setState((idle: true, count: state.count + value));
      });

  void subtract(int value) => handle(() async {
        setState((idle: false, count: state.count));
        await Future<void>.delayed(const Duration(milliseconds: 1500));
        setState((idle: true, count: state.count - value));
      });
}

应用入口

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

  @override
  Widget build(BuildContext context) => MaterialApp(
      title: 'StateController example',
      theme: ThemeData.dark(),
      home: const CounterScreen(),
      builder: (context, child) =>
          // 创建并注入控制器到元素树中。
          ControllerScope<CounterController>(
            CounterController.new,
            child: child,
          ));
}

计数器界面

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

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: const Text('Counter'),
        ),
        floatingActionButton: const CounterScreen$Buttons(),
        body: const SafeArea(
          child: Center(
            child: CounterScreen$Text(),
          ),
        ),
      );
}

class CounterScreen$Text extends StatelessWidget {
  const CounterScreen$Text({
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    final style = theme.textTheme.headlineMedium;
    return Row(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'Count: ',
          style: style,
        ),
        SizedBox.square(
          dimension: 64,
          child: Center(
            // 从元素树中接收 CounterController 并在状态变化时重建小部件。
            child: StateConsumer<CounterController, CounterState>(
              buildWhen: (previous, current) =>
                  previous.count != current.count ||
                  previous.idle != current.idle,
              builder: (context, state, _) {
                final text = state.count.toString();
                return AnimatedSwitcher(
                  duration: const Duration(milliseconds: 500),
                  transitionBuilder: (child, animation) => ScaleTransition(
                    scale: animation,
                    child: FadeTransition(
                      opacity: animation,
                      child: child,
                    ),
                  ),
                  child: state.idle
                      ? Text(text, style: style, overflow: TextOverflow.fade)
                      : const CircularProgressIndicator(),
                );
              },
            ),
          ),
        ),
      ],
    );
  }
}

class CounterScreen$Buttons extends StatelessWidget {
  const CounterScreen$Buttons({
    super.key,
  });

  @override
  Widget build(BuildContext context) => ValueListenableBuilder<bool>(
        // 将 [StateController] 转换为 [ValueListenable]
        valueListenable: context
            .controllerOf<CounterController>()
            .select((state) => state.idle),
        builder: (context, idle, _) => IgnorePointer(
          ignoring: !idle,
          child: AnimatedOpacity(
            duration: const Duration(milliseconds: 350),
            opacity: idle ? 1 : .25,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                FloatingActionButton(
                  key: ValueKey('add#${idle ? 'enabled' : 'disabled'}'),
                  onPressed: idle
                      ? () => context.controllerOf<CounterController>().add(1)
                      : null,
                  child: const Icon(Icons.add),
                ),
                const SizedBox(height: 8),
                FloatingActionButton(
                  key: ValueKey('subtract#${idle ? 'enabled' : 'disabled'}'),
                  onPressed: idle
                      ? () =>
                          context.controllerOf<CounterController>().subtract(1)
                      : null,
                  child: const Icon(Icons.remove),
                ),
              ],
            ),
          ),
        ),
      );
}

以上代码展示了一个完整的计数器应用,使用了 control 插件进行状态管理。你可以根据需要修改或扩展这个示例。希望这个示例对你有所帮助!


更多关于Flutter控制功能插件control的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter控制功能插件control的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然没有一个官方或广泛认可的名为“control”的插件,但通常我们可能会使用各种插件来控制硬件功能、UI组件状态等。这里,我将展示一个使用Flutter社区中常见的插件来控制某些功能的示例代码。

假设我们要控制设备的亮度,我们可以使用flutter_brightness插件。虽然这个插件的名字不是“control”,但它展示了如何在Flutter中控制设备的一个具体功能。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_brightness: ^0.5.0  # 请检查最新版本号

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

接下来,我们编写一个示例应用,该应用可以读取和设置设备的亮度:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Brightness Control',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BrightnessControlPage(),
    );
  }
}

class BrightnessControlPage extends StatefulWidget {
  @override
  _BrightnessControlPageState createState() => _BrightnessControlPageState();
}

class _BrightnessControlPageState extends State<BrightnessControlPage> {
  Brightness _brightness = Brightness.dark; // 初始值,实际使用中应为动态获取
  double _brightnessValue = 1.0; // 默认亮度值

  @override
  void initState() {
    super.initState();
    _getBrightness();
  }

  Future<void> _getBrightness() async {
    BrightnessSystemMode systemBrightness = await FlutterBrightness.getSystemBrightness();
    double brightnessValue = await FlutterBrightness.getBrightness();

    setState(() {
      _brightness = systemBrightness == BrightnessSystemMode.light ? Brightness.light : Brightness.dark;
      _brightnessValue = brightnessValue;
    });
  }

  Future<void> _setBrightness(double value) async {
    await FlutterBrightness.setBrightness(value);
    setState(() {
      _brightnessValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Brightness Control'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Brightness: $_brightnessValue',
              style: TextStyle(fontSize: 24),
            ),
            Slider(
              value: _brightnessValue,
              min: 0.0,
              max: 1.0,
              divisions: 10,
              onChanged: (double value) {
                setState(() {
                  _brightnessValue = value;
                });
                // 调用设置亮度的函数
                _setBrightness(value);
              },
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用flutter_brightness插件来获取和设置设备的亮度。
  2. initState方法中调用_getBrightness函数来获取当前的亮度值。
  3. 使用一个Slider组件来允许用户调整亮度,并在滑动条值变化时调用_setBrightness函数来设置新的亮度值。

请注意,这个插件可能需要特定的权限(如WRITE_SETTINGS),这需要在Android的AndroidManifest.xml文件中声明,并且在运行时请求用户权限。此外,iOS上可能也有类似的权限要求。

这个示例展示了如何使用Flutter插件来控制设备的一个具体功能。如果你有其他特定的控制需求,可能需要查找或创建相应的Flutter插件。

回到顶部