Flutter屏幕控制插件flutter_screen_controller的使用

Flutter屏幕控制插件flutter_screen_controller的使用

单屏逻辑与UI分离的简便方法

动机: 我们有StatefulWidget中的setState,但缺点是我们的屏幕逻辑与展示代码混合在一起。此插件旨在解决这个问题,提供一种分离每个屏幕UI逻辑的方法。

🎖 特性 #

对于每个控制器,您可以使用这些方法:

  • onInit:执行早期初始化(类似于initState),
  • onReady:执行需要更新UI的初始化(例如数据获取)
  • onDispose:释放资源(类似于dispose)
  • updateUI:类似于setState,但您可以无参数调用它

此外,您还可以享受以下好处:

  • ❤️ 将逻辑从UI分离出来
  • ↩️ 仅刷新屏幕所需的部分
  • 🔌 您可以为同一屏幕拥有多个具有独立逻辑的控制器
  • 🔌 您可以从另一个屏幕继承逻辑
  • 💾 您可以创建可以在屏幕上重用的逻辑部分
  • ⚡ 没有限制,您可以同时使用StatefulWidget和ScreenController
  • 🚀 预定义的控制器已经可用,比如在演示中使用的那个。
  • 🛡️ 支持空安全

🔩 安装 #

flutter pub add flutter_screen_controller

或者,在您的pubspec.yaml文件中添加:

dependencies:
  flutter_screen_controller: <last_version>

⚡️ 导入 #

import 'package:flutter_screen_controller/flutter_screen_controller.dart';

🎮 如何使用 #

首先创建您的控制器,这里是一个示例:

SettingsController

/// 一个类,许多Widgets可以通过它读取用户设置、更新用户设置或监听用户设置变化。
///
/// 控制器将数据服务与Flutter Widgets连接起来。SettingsController使用SettingsService来存储和检索用户设置。
class SettingsController extends ScreenController {

  SettingsController(super.state);

  // 将SettingsService设为私有变量,以便不直接使用。
  late final SettingsService _settingsService;

  // 将ThemeMode设为私有变量,以便不直接更新,除非也使用SettingsService持久化更改。
  late ThemeMode _themeMode;

  // 允许Widgets读取用户首选的主题模式。
  ThemeMode get themeMode => _themeMode;

  // 在此方法中执行不需要UI更新的早期初始化。
  [@override](/user/override)
  void onInit() {
    _settingsService = SettingsService();
  }

  // 在此方法中执行将更新UI的初始化。
  [@override](/user/override)
  void onReady() {
    _loadSettings();
  }

  /// 从SettingsService加载用户的设置。它可能从本地数据库或互联网加载。控制器只知道可以从服务中加载设置。
  Future<void> _loadSettings() async {
    _themeMode = await _settingsService.themeMode();

    // 重要!通知屏幕已发生更改。
    refreshUI();
  }

  /// 基于用户的选择更新并持久化主题模式。
  Future<void> updateThemeMode(ThemeMode? newThemeMode) async {
    if (newThemeMode == null) return;

    // 如果新旧主题模式相同,则不执行任何工作
    if (newThemeMode == _themeMode) return;

    // 否则,在内存中存储新的主题模式
    _themeMode = newThemeMode;

    // 重要!通知屏幕已发生更改。
    refreshUI();

    // 使用SettingService通过本地数据库或互联网持久化更改。
    await _settingsService.updateThemeMode(newThemeMode);
  }
}

然后在您的屏幕中使用它:

SettingsScreen

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

  static const routeName = '/settings';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Settings'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16),
        // 粘贴SettingsController。
        //
        // 当用户从下拉列表中选择主题时,SettingsController将被更新,这将重建由控制器包裹的部分屏幕。
        child: ScreenControllerBuilder( // 不要忘记包装小部件
          create: SettingsController.new, // 添加您的控制器
          builder: (context, controller) => DropdownButton<ThemeMode>(
          // 从控制器中读取选定的主题模式
          value: controller.themeMode,
          // 用户每次选择主题时调用updateThemeMode方法。
          onChanged: controller.updateThemeMode,
          items: const [
            DropdownMenuItem(
              value: ThemeMode.system,
              child: Text('System Theme'),
            ),
            DropdownMenuItem(
              value: ThemeMode.light,
              child: Text('Light Theme'),
            ),
            DropdownMenuItem(
              value: ThemeMode.dark,
              child: Text('Dark Theme'),
            )
          ],
        ),
        ),
      ),
    );
  }
}

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

1 回复

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


flutter_screen_controller 是一个用于控制屏幕方向、亮度和保持屏幕常亮的 Flutter 插件。它可以帮助开发者轻松地管理屏幕的各种属性。以下是如何使用 flutter_screen_controller 的基本指南。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_screen_controller: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 flutter_screen_controller

import 'package:flutter_screen_controller/flutter_screen_controller.dart';

3. 使用插件

flutter_screen_controller 提供了多种方法来控制屏幕属性。以下是一些常见的用法:

3.1 控制屏幕方向

你可以使用 FlutterScreenController.setOrientation 方法来设置屏幕方向。例如:

// 设置屏幕为竖屏
FlutterScreenController.setOrientation(FlutterScreenOrientation.portraitUp);

// 设置屏幕为横屏
FlutterScreenController.setOrientation(FlutterScreenOrientation.landscapeLeft);

// 允许屏幕自动旋转
FlutterScreenController.setOrientation(FlutterScreenOrientation.auto);

3.2 控制屏幕亮度

你可以使用 FlutterScreenController.setBrightness 方法来设置屏幕亮度,范围是 0.01.0

// 设置屏幕亮度为 50%
FlutterScreenController.setBrightness(0.5);

3.3 保持屏幕常亮

你可以使用 FlutterScreenController.keepOn 方法来保持屏幕常亮:

// 保持屏幕常亮
FlutterScreenController.keepOn(true);

// 取消保持屏幕常亮
FlutterScreenController.keepOn(false);

3.4 获取当前屏幕亮度

你可以使用 FlutterScreenController.getBrightness 方法来获取当前屏幕亮度:

double brightness = await FlutterScreenController.getBrightness();
print('当前屏幕亮度: $brightness');

4. 示例代码

以下是一个完整的示例,展示了如何使用 flutter_screen_controller 来控制屏幕方向和亮度:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScreenControllerDemo(),
    );
  }
}

class ScreenControllerDemo extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Screen Controller Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                FlutterScreenController.setOrientation(FlutterScreenOrientation.portraitUp);
              },
              child: Text('竖屏'),
            ),
            ElevatedButton(
              onPressed: () {
                FlutterScreenController.setOrientation(FlutterScreenOrientation.landscapeLeft);
              },
              child: Text('横屏'),
            ),
            ElevatedButton(
              onPressed: () {
                FlutterScreenController.setBrightness(0.5);
              },
              child: Text('设置亮度为 50%'),
            ),
            ElevatedButton(
              onPressed: () {
                FlutterScreenController.keepOn(true);
              },
              child: Text('保持屏幕常亮'),
            ),
            ElevatedButton(
              onPressed: () async {
                double brightness = await FlutterScreenController.getBrightness();
                print('当前屏幕亮度: $brightness');
              },
              child: Text('获取当前屏幕亮度'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部