Flutter状态管理插件state_mgr的使用

Flutter状态管理插件state_mgr的使用

state_mgr 是一个用于 Flutter 应用的状态管理库。它允许你在不使用 StatefulWidget 的情况下管理对象的状态。

ChangeLog

ChangeLog.md

关于

该插件允许你管理对象的状态,而不需要使用 StatefulWidget。状态管理器可以让你将模型的状态管理和其展示逻辑分开。

使用

下面是一个基本的应用示例,展示了如何使用 state_mgr 库。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: '简单状态管理示例',
      home: MyStaterPage(title: 'Flutter Demo 状态管理页面'),
    );
  }
}

class MyStaterPage extends StatelessWidget {
  const MyStaterPage({super.key, required this.title});

  final String title;

  static int _counter = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stater<StateManager>(
        builder: (stater) {
          return Scaffold(
            appBar: AppBar(
              title: Text(title),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  const Text(
                    '你已经按下了按钮这么多次:',
                  ),
                  Text(
                    '$_counter',
                    style: Theme.of(context).textTheme.headline4,
                  ),
                ],
              ),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () {
                _counter++;
                stater.invalidate();
              },
              tooltip: '增加',
              child: const Icon(Icons.add),
            ), // 这个逗号使得构建方法更美观
          );
        }
    );
  }
}

让我们将计数器状态处理逻辑提取到一个单独的类 CounterState 中。

class MyStaterPage extends StatelessWidget {
  const MyStaterPage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stater(
        manager: () => CounterState(),
        builder: (stater) {
          return Scaffold(
            appBar: AppBar(
              title: Text(title),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  const Text(
                    '你已经按下了按钮这么多次:',
                  ),
                  Text(
                    '${stater.counter}',
                    style: Theme.of(context).textTheme.headline4,
                  ),
                ],
              ),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () => stater.counter++,
              tooltip: '增加',
              child: const Icon(Icons.add),
            ), // 这个逗号使得构建方法更美观
          );
        }
    );
  }
}

class CounterState extends StateManager {
  int _counter = 0;
  int get counter => _counter;
  set counter(int value) {
    if (_counter == value) return;
    _counter = value;
    invalidate();
  }
}

现在所有的计数器状态管理逻辑都可以在单独的 CounterState 类中完成。

例如,我们可以添加模拟从服务器获取响应的延迟。

class CounterState extends StateManager {
  int _counter = 0;
  int get counter => _counter;
  set counter(int value) {
    if (_counter == value) return;

    Future.delayed(const Duration(seconds: 1), () {
      _counter = value;
      invalidate();
    });
  }
}

现在我们可以扩展并添加更多选项来控制计数器状态逻辑。

完整示例代码

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '状态管理演示',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyStaterPage(title: '状态管理演示页面'),
    );
  }
}

class MyStaterPage extends StatelessWidget {
  final String title;

  const MyStaterPage({super.key, required this.title});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Stater(manager: () => CounterState('能量')),
          Stater(manager: () => CounterState('健康')),
          Stater(manager: () => CounterState('伤害')),
        ],
      ),
    );
  }
}

class CounterState extends StateManager {
  String label;

  CounterState(this.label);

  int _value = 0;

  int get value => _value;

  set value(int value) {
    if (value < 0) value = 0;
    if (_value == value) return;
    _value = value;
    invalidate();
  }

  void dec() => value--;

  void inc() => value++;

  [@override](/user/override)
  Widget build() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          '$label: $value',
          style: Theme.of(context).textTheme.headline4,
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            OutlinedButton(
                style: OutlinedButton.styleFrom(backgroundColor: Colors.red.shade100),
                onPressed: value > 0 ? dec : null,
                child: const Icon(Icons.keyboard_arrow_left)),
            const SizedBox(width: 5),
            OutlinedButton(
                style: OutlinedButton.styleFrom(backgroundColor: Colors.green.shade100),
                onPressed: inc,
                child: const Icon(Icons.keyboard_arrow_right)),
          ],
        )
      ],
    );
  }
}

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

1 回复

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


state_mgr 是一个轻量级的 Flutter 状态管理插件,它通过使用 ValueNotifierValueListenableBuilder 来管理应用的状态。它提供了一种简单的方式来管理应用程序的状态,并且可以避免使用复杂的依赖注入或全局状态管理解决方案。

安装

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

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

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

基本用法

state_mgr 的核心是 StateMgr 类,它允许你创建一个状态管理器,并通过 ValueNotifier 来管理状态。

1. 创建状态管理器

import 'package:state_mgr/state_mgr.dart';

final counterState = StateMgr<int>(0);

这里我们创建了一个 StateMgr 实例,初始值为 0

2. 使用 ValueListenableBuilder 监听状态变化

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

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

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

class CounterScreen extends StatelessWidget {
  final counterState = StateMgr<int>(0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter Example')),
      body: Center(
        child: ValueListenableBuilder<int>(
          valueListenable: counterState,
          builder: (context, value, child) {
            return Text('Counter: $value');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterState.value++;  // 更新状态
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个例子中,我们使用 ValueListenableBuilder 来监听 counterState 的变化,并在状态变化时更新 UI。

3. 更新状态

你可以通过直接修改 StateMgrvalue 属性来更新状态:

counterState.value++;  // 增加计数器

4. 组合多个状态

你可以使用 StateMgr 来管理多个状态,并通过 ValueListenableBuilder 来监听多个状态的变化。

final counterState = StateMgr<int>(0);
final textState = StateMgr<String>('Hello');

ValueListenableBuilder(
  valueListenable: counterState,
  builder: (context, counterValue, child) {
    return ValueListenableBuilder(
      valueListenable: textState,
      builder: (context, textValue, child) {
        return Column(
          children: [
            Text('Counter: $counterValue'),
            Text('Text: $textValue'),
          ],
        );
      },
    );
  },
);

高级用法

1. 使用 StateMgr 进行依赖注入

你可以在应用程序的顶层创建 StateMgr 实例,并将其传递给需要访问状态的组件。

class MyApp extends StatelessWidget {
  final counterState = StateMgr<int>(0);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(counterState: counterState),
    );
  }
}

class CounterScreen extends StatelessWidget {
  final StateMgr<int> counterState;

  CounterScreen({required this.counterState});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter Example')),
      body: Center(
        child: ValueListenableBuilder<int>(
          valueListenable: counterState,
          builder: (context, value, child) {
            return Text('Counter: $value');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterState.value++;  // 更新状态
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

2. 使用 StateMgr 进行状态持久化

你可以将 StateMgrSharedPreferences 或其他持久化解决方案结合使用,以便在应用程序重启时保持状态。

import 'package:shared_preferences/shared_preferences.dart';

final counterState = StateMgr<int>(0);

void loadCounter() async {
  final prefs = await SharedPreferences.getInstance();
  counterState.value = prefs.getInt('counter') ?? 0;
}

void saveCounter() async {
  final prefs = await SharedPreferences.getInstance();
  prefs.setInt('counter', counterState.value);
}
回到顶部