Flutter状态管理插件states_rebuilder的使用

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

Flutter状态管理插件states_rebuilder的使用

简介

states_rebuilder 是一个用于Flutter应用程序的状态管理库,它具有以下特点:

  • 代码清晰:分离UI和业务逻辑、零样板代码、纯Dart编写业务逻辑。
  • 性能优越:支持不可变/可变状态、可预测且可控、严格控制重建。
  • 用户友好:优雅轻量级语法、在无状态小部件中使用SetState和动画、无需BuildContext的导航、内置依赖注入系统。
  • 高效生产:易于CRUD开发、用户认证授权、应用主题和多语言管理、易于测试和模拟依赖。

安装与导入

  1. 安装包

    • 使用Flutter命令安装:
      flutter pub add states_rebuilder
      
    • 或者在pubspec.yaml中添加依赖:
      dependencies:
        states_rebuilder: ^5.0.0
      
  2. 导入库

    import 'package:states_rebuilder/states_rebuilder.dart';
    

基本用法示例

1. 创建计数器应用

业务逻辑类(ViewModel)

class Counter {
  final int value;
  Counter(this.value);

  @override
  String toString() => 'Counter($value)';
}

@immutable
class ViewModel {
  final counter1 = 0.inj();
  final counter2 = RM.inject<Counter>(
    () => Counter(0),
    undoStackLength: 8,
    debugPrintWhenNotifiedPreMessage: 'counter2',
  );

  int get sum => counter1.state + counter2.state.value;

  void incrementCounter1() {
    counter1.state++;
  }

  void incrementCounter2() {
    counter2.state = Counter(counter2.state.value + 1);
  }
}

全局实例化ViewModel

final viewModel = ViewModel();

UI部分(CounterApp)

class CounterApp extends ReactiveStatelessWidget {
  const CounterApp();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Counter1View(), // Not const to make it rebuildable
            const Counter2View(), // Notice the use of const modifier (good approach)
            Text('Result: ${viewModel.sum}'), // Will be updated when sum changes
          ],
        ),
      ),
    );
  }
}

class Counter1View extends StatelessWidget {
  const Counter1View({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          child: const Text('Counter1 ++'),
          onPressed: () => viewModel.incrementCounter1(),
        ),
        Text('Counter1 value: ${viewModel.counter1.state}'),
      ],
    );
  }
}

class Counter2View extends ReactiveStatelessWidget {
  const Counter2View({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          child: const Text('Counter2 ++'),
          onPressed: () => viewModel.incrementCounter2(),
        ),
        ElevatedButton(
          child: const Text('Undo'),
          onPressed: () => viewModel.counter2.undoState(),
        ),
        Text('Counter2 value: ${viewModel.counter2.state.value}'),
      ],
    );
  }
}

2. 注册并监听状态变化

使用OnReactiveReactiveStatelessWidget来注册并监听状态变化。例如,在CounterApp中,我们使用了ReactiveStatelessWidget来自动注册并监听状态变化。

3. 状态持久化

可以通过设置persist参数来实现状态的持久化:

final model = RM.inject<MyModel>(
  () => MyModel(),
  persist: () => PersistState(
    key: 'modelKey',
    toJson: (MyModel s) => s.toJson(),
    fromJson: (String json) => MyModel.fromJson(json),
    throttleDelay: 1000,
  ),
);

4. 动态主题切换

动态切换主题可以通过RM.injectTheme来实现:

final theme = RM.injectTheme<String>(
  lightThemes: {
    'simple': ThemeData.light(...),
    'solarized': ThemeData.light(...),
  },
  darkThemes: {
    'simple': ThemeData.dark(...),
    'solarized': ThemeData.dark(...),
  },
  themeMode: ThemeMode.system,
  persistKey: '__theme__',
);

// 切换主题
theme.state = 'solarized';
// 切换深浅模式
theme.toggle();

5. 国际化与本地化

通过RM.injectI18N实现国际化和本地化:

final i18n = RM.injectI18N<EnUS>(
  {
    Locale('en', 'US'): () => EnUS(),
    Locale('es', 'ES'): () => EsEs(),
  },
  persistKey: '__lang__',
);

Text(i18n.of(context).helloWorld);

总结

states_rebuilder 提供了一种简洁且功能强大的方式来进行Flutter应用的状态管理。通过上述基本用法和示例代码,您可以快速上手并在实际项目中应用该库。更多高级功能和详细信息可以参考官方文档和示例项目。


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

1 回复

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


在Flutter开发中,states_rebuilder 是一个强大的状态管理插件,它允许开发者以声明式的方式高效地管理应用状态。下面是一个关于如何使用 states_rebuilder 的代码示例,展示了其基本用法。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  states_rebuilder: ^x.x.x  # 请替换为最新版本号

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

2. 创建一个全局状态管理

通常,你会创建一个全局的状态管理类来持有应用的状态。这里我们创建一个简单的计数器状态类:

import 'package:states_rebuilder/states_rebuilder.dart';

class CounterState with RebuildNotifier {
  int count = 0;

  void increment() {
    count++;
    notifyListeners();  // 通知监听者状态已更改
  }
}

3. 在应用中使用状态管理

接下来,在你的 Flutter 应用中使用 states_rebuilder 来管理这个状态。

import 'package:flutter/material.dart';
import 'package:states_rebuilder/states_rebuilder.dart';
import 'counter_state.dart';  // 假设你的状态类放在这个文件里

void main() {
  // 创建全局状态实例
  final CounterState counterState = CounterState();

  runApp(Rebuilder(
    builder: () => MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('States Rebuilder Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Rebuilder<CounterState>(
                builder: (context, state, widget) => Text(
                  '${state.count}',
                  style: Theme.of(context).textTheme.headline4,
                ),
                model: counterState,
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            counterState.increment();
          },
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    ),
  ));
}

代码解释

  1. 创建全局状态实例

    final CounterState counterState = CounterState();
    
  2. 使用 Rebuilder 包裹整个应用

    runApp(Rebuilder(
      builder: () => MaterialApp(...),
    ));
    
  3. 在需要监听状态变化的组件上使用 Rebuilder<T>

    Rebuilder<CounterState>(
      builder: (context, state, widget) => Text(
        '${state.count}',
        style: Theme.of(context).textTheme.headline4,
      ),
      model: counterState,
    ),
    
  4. 更新状态: 当按钮被点击时,调用 counterState.increment() 来更新状态,这将触发所有监听这个状态的 Rebuilder 组件重建。

总结

以上代码展示了如何使用 states_rebuilder 插件在 Flutter 应用中进行状态管理。通过创建状态类并使用 Rebuilder 组件监听这些状态,你可以轻松地在应用中管理复杂的状态逻辑。

回到顶部