Flutter全局变量管理插件flutter_globals的使用

Flutter全局变量管理插件flutter_globals的使用

Global 是一个基于单例的动态状态管理器,允许以全局方式管理变量,并且与 flutter_secure_storage 集成良好。这使得您的应用程序的数据持久化变得非常方便,例如缓存、令牌等常用信息可以轻松访问。

特性

  • refresh(dynamic dependency): 通知特定监听器更新其状态。
  • refreshAll(): 通知所有监听器更新其状态。
  • statusOf(String key): 返回一个工作者的状态。
  • setStatus(String key, dynamic status): 设置一个工作者的状态。
  • set(String key, dynamic value): 在全局中设置与键关联的值并返回该键的引用。
  • make(String key, Function(dynamic) maker): 使用 maker 函数创建一个值并返回该键的引用。
  • get(String key): 获取全局中与键关联的值。
  • store(String key, dynamic value): 使用 flutter_secure_storage 将值存储在设备上。
  • free(String key): 移除全局中的键及其值。
  • ref(String key): 返回全局中键的引用。
  • clear(): 移除全局中的所有值。
  • lock(String key): 锁定特定键以避免更改。
  • unlock(String key): 解锁先前锁定的键。
  • on(String key, Function(dynamic params, Function(dynamic) setStatus) work): 为全局中的键定义要执行的工作。
  • off(String key): 移除与键关联的工作。
  • call(String key, {dynamic params}): 执行与键关联的工作并更新状态。
  • caller(String key, {dynamic params}): 返回一个函数,可用于执行与键关联的工作。
  • bind(dynamic obj): 返回对象的单例实例。
  • dispose(dynamic obj): 移除对象的单例实例。

开始使用

Global 不需要任何设置,只需安装包并在需要的地方使用即可!

使用示例

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

// 定义枚举类型
enum MyGlobals { token, userName, userId }

// 定义动作枚举类型
enum MyAction {
  absent,
  loading,
  sucess,
  fail,
}

// 定义控制器类
class MyController {
  List<String> myExamples = [];
  int counter = 0;

  // 登录方法
  Future<void> login() async {
    final token = await Restify.get<String>("/login");
    Global.set(MyGlobals.token, token).store(); // 将令牌保存到本地存储并全局可用
  }

  // 自定义函数
  Future<void> myFunction() async {
    Global.setStatus(MyAction.loading);
    try {
      final examples = await Restify.get<List<String>>("/examples", bearerToken: Global.get(MyGlobals.token));
      myExamples = examples;
      Global.setStatus(MyAction.sucess); // 更新请求状态为成功并更新反应式组件
    } catch (err) {
      Global.setStatus(MyAction.fail); // 更新请求状态为失败并更新反应式组件
    }
  }

  // 计数方法
  void count() {
    counter++;
    Global.refresh(); // 更新反应式组件
  }
}

// 主页面类
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 绑定控制器
  late final MyController myController = Global.bind(MyController());

  [@override](/user/override)
  void initState() {
    super.initState();
    myController.myFunction();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Reactive(() => Text("Counter: ${myController.counter}")), // 使文本具有反应性
      ),
      body: ReactiveStatus<MyAction>(
        // 允许屏幕根据状态更改其组件
        {
          MyAction.sucess: () => ListView(
            children: myController.myExamples.map((e) => Text(e)).toList(),
          ),
          MyAction.fail: () => const Text(" fail :( "),
          MyAction.loading: () => const CircularProgressIndicator(),
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: myController.count,
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter全局变量管理插件flutter_globals的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter全局变量管理插件flutter_globals的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_globals 是一个用于管理全局变量的 Flutter 插件。它提供了一种简单的方式来在应用程序中共享和管理全局状态,而不需要使用复杂的状态管理解决方案如 ProviderRiverpod。以下是 flutter_globals 的基本使用方法。

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  flutter_globals: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 flutter_globals

import 'package:flutter_globals/flutter_globals.dart';

3. 创建全局变量

你可以使用 Global 类来创建全局变量。例如:

final Global<int> counter = Global<int>(0);

这将创建一个名为 counter 的全局变量,并将其初始值设置为 0

4. 访问和修改全局变量

你可以通过 value 属性来访问和修改全局变量的值:

void incrementCounter() {
  counter.value++;
}

void printCounter() {
  print('Counter value: ${counter.value}');
}

5. 在 Widget 中使用全局变量

你可以直接在 Widget 中使用全局变量。例如,在一个 StatelessWidget 中:

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Globals Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Counter Value: ${counter.value}',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
              onPressed: incrementCounter,
              child: Text('Increment Counter'),
            ),
          ],
        ),
      ),
    );
  }
}

6. 监听全局变量的变化

你可以使用 addListener 方法来监听全局变量的变化:

void main() {
  counter.addListener(() {
    print('Counter changed to: ${counter.value}');
  });

  runApp(MyApp());
}

7. 移除监听器

如果你不再需要监听全局变量的变化,可以使用 removeListener 方法来移除监听器:

void dispose() {
  counter.removeListener(myListener);
}

8. 销毁全局变量

当你不再需要某个全局变量时,可以调用 dispose 方法来销毁它:

void dispose() {
  counter.dispose();
}

9. 完整示例

以下是一个完整的示例,展示了如何使用 flutter_globals 来管理全局变量:

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

final Global<int> counter = Global<int>(0);

void incrementCounter() {
  counter.value++;
}

void printCounter() {
  print('Counter value: ${counter.value}');
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Globals Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Globals Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Counter Value: ${counter.value}',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
              onPressed: incrementCounter,
              child: Text('Increment Counter'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  counter.addListener(() {
    print('Counter changed to: ${counter.value}');
  });

  runApp(MyApp());
}
回到顶部