Flutter状态管理插件very_simple_state_manager的使用

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

Flutter状态管理插件very_simple_state_manager的使用

very_simple_state_manager是一个简单易用的状态管理插件,它结合了Flutter核心组件、BLoC架构、ChangeNotifier的简洁性和Riverpod的状态感知能力。本文将详细介绍如何使用这个插件,并提供完整的示例代码。

🔍 工作原理

  • 简单:易于理解和实现。
  • 响应式:UI会随着状态的变化自动更新。
  • 干净:逻辑与UI分离,便于代码组织。
  • 无依赖:仅依赖于Flutter内置的ValueNotifierValueListenableBuilder

🚀 开始使用

首先,在您的Flutter项目中添加该插件:

flutter pub add very_simple_state_manager

📖 使用方法

1. 创建状态管理器

创建一个简单的计数器管理器:

class CounterManager extends StateManager<int> {
  CounterManager() : super(0);

  void increment() {
    state = state + 1;
  }
}

2. 在UI中使用

Option 1: StateBuilder

这是最简单的方式,用于响应状态变化:

class CounterWidget extends StatefulWidget {
  [@override](/user/override)
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  late final CounterManager _counter;

  [@override](/user/override)
  void initState() {
    super.initState();
    _counter = CounterManager();
  }

  [@override](/user/override)
  void dispose() {
    _counter.dispose(); // 不要忘记释放状态管理器
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: StateBuilder(
        stateManager: _counter,
        builder: (context, count) => Center(
          child: Text('Count: $count'),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _counter.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

Option 2: ManagedWidget

这是一个替代StatelessWidget的选择,自动在状态变化时重建:

class CounterWidget extends ManagedWidget<CounterManager, int> {
  [@override](/user/override)
  CounterManager createStateManager() => CounterManager();

  [@override](/user/override)
  Widget build(BuildContext context, int state) { 
    return Scaffold(
      body: Center(
        child: Text('Count: $state'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: stateManager.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

Option 3: ManagedStatefulWidget

当您需要StatefulWidget的功能并自动在状态变化时重建时:

class CounterWidget extends ManagedStatefulWidget<CounterManager, int> {
  const CounterWidget({super.key});

  [@override](/user/override)
  CounterManager createStateManager() => CounterManager();

  [@override](/user/override)
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends ManagedState<CounterManager, int, CounterWidget> {
  void _handleIncrement() {
    stateManager.increment(); 
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Count: $state'), 
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _handleIncrement,
        child: Icon(Icons.add),
      ),
    );
  }
}

Option 4: SelectedStateBuilder

当您只需要基于状态的一部分进行重建时:

class ComplexCounterManager extends StateManager<CounterState> {
  ComplexCounterManager() : super(CounterState(count: 0, lastUpdated: DateTime.now()));

  void increment() {
    state = CounterState(count: state.count + 1, lastUpdated: DateTime.now());
  }
}

class CounterWidget extends StatelessWidget {
  final ComplexCounterManager _counter = ComplexCounterManager();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          SelectedStateBuilder(
            stateManager: _counter,
            selector: (state) => state.count,
            builder: (context, count) => Text('Count: $count'),
          ),
          SelectedStateBuilder(
            stateManager: _counter,
            selector: (state) => state.lastUpdated,
            builder: (context, lastUpdated) => Text('Last Updated: $lastUpdated'),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _counter.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

💪 简单却强大

处理复杂的状态管理也可以保持代码的整洁和可维护性:

class UserManager extends StateManager<UserState> {
  UserManager(this._repository) : super(InitialUserState());

  final UserRepository _repository;

  Future<void> loadUser(String id) async {
    state = LoadingUserState();

    try {
      final user = await _repository.getUserById(id);
      state = LoadedUserState(user);
    } on Exception catch (e) {
      state = ErrorUserState(e);
    }
  }

  void updateName(String newName) {
    state = LoadedUserState(state.user.copyWith(name: newName));
  }
}

实际示例Demo

下面是一个完整的示例应用,演示如何在实际项目中使用very_simple_state_manager

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Very Simple State Manager Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(
        child: Text(
          'Please run one of the example main files:\n\n'
          '- state_builder_main.dart\n'
          '- selected_state_builder_main.dart\n'
          '- managed_widget_main.dart\n'
          '- managed_stateful_widget_main.dart',
          textAlign: TextAlign.center,
          style: TextStyle(fontSize: 16),
        ),
      ),
    );
  }
}

// 示例中的CounterWidget可以替换为上述任意一种方式
class CounterWidget extends ManagedWidget<CounterManager, int> {
  [@override](/user/override)
  CounterManager createStateManager() => CounterManager();

  [@override](/user/override)
  Widget build(BuildContext context, int state) { 
    return Scaffold(
      appBar: AppBar(title: Text('Counter Example')),
      body: Center(
        child: Text('Count: $state'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: stateManager.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用very_simple_state_manager插件的一个简单示例。very_simple_state_manager是一个轻量级的状态管理库,适用于小型到中型的应用。

首先,确保你已经在pubspec.yaml文件中添加了依赖:

dependencies:
  flutter:
    sdk: flutter
  very_simple_state_manager: ^最新版本号 # 请替换为实际的最新版本号

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

接下来,我们将展示如何使用very_simple_state_manager来管理状态。假设我们有一个简单的计数器应用。

1. 创建一个State类

首先,我们创建一个包含我们应用状态的类。在这个例子中,我们将创建一个包含计数器值的类。

import 'package:very_simple_state_manager/very_simple_state_manager.dart';

class CounterState extends VSState<int> {
  CounterState() : super(0); // 初始化计数器的值为0

  void increment() {
    value = value + 1;
    notifyListeners(); // 通知监听器状态已更改
  }
}

2. 创建ViewModel

接下来,我们创建一个ViewModel来管理状态。ViewModel通常包含状态实例并提供操作这些状态的方法。

import 'package:very_simple_state_manager/very_simple_state_manager.dart';

class CounterViewModel extends VSViewModel {
  final CounterState counterState;

  CounterViewModel() : counterState = CounterState();

  void incrementCounter() {
    counterState.increment();
  }
}

3. 在UI中使用ViewModel和状态

现在,我们需要在UI中使用我们的ViewModel和状态。我们将使用VSProvider来提供ViewModel,并使用VSConsumer来监听状态的变化。

import 'package:flutter/material.dart';
import 'package:very_simple_state_manager/very_simple_state_manager.dart';
import 'counter_view_model.dart'; // 导入我们之前创建的ViewModel文件
import 'counter_state.dart'; // 导入我们之前创建的状态文件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return VSProvider<CounterViewModel>(
      create: () => CounterViewModel(),
      child: MaterialApp(
        home: CounterPage(),
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: VSConsumer<CounterViewModel>(
          builder: (context, viewModel, child) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${viewModel.counterState.value}',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            );
          },
          updateShouldNotify: (prev, next) => prev.counterState.value != next.counterState.value,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          VSProvider.of<CounterViewModel>(context).incrementCounter();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个例子中,我们创建了一个简单的计数器应用,使用very_simple_state_manager来管理状态。CounterState类包含计数器值并提供增加计数器的方法。CounterViewModel类管理这个状态。在UI中,我们使用VSProvider来提供ViewModel,并使用VSConsumer来监听和显示状态。

这个示例展示了如何使用very_simple_state_manager来管理应用状态,但实际应用中可能会更复杂。根据需求,你可以扩展这个示例来处理更多的状态和逻辑。

回到顶部