Flutter状态管理插件flutter_state_management的使用

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

Flutter状态管理插件flutter_state_management的使用

Flutter State Management

flutter_state_management 是一个简单的状态管理插件,它基于 Flutter 框架内置的 ChangeNotifierListenable 类。这个插件旨在简化状态管理的使用,同时保持轻量级,避免引入不必要的复杂性。

特点

  • 无需额外学习曲线:如果你已经熟悉 Flutter,那么使用这个插件非常简单。
  • 基于 ChangeNotifier 的简单包:没有多余的依赖和复杂的配置。

使用方法

创建模型类

你可以创建一个继承自 StateNotifierPersistedStateNotifier 的模型类来管理状态。

示例:不持久化的状态管理

class Counter extends StateNotifier<int, String> {
  Counter() : super(const Active(data: 0));

  void increment() async {
    setWaiting(data: data);

    await Future.delayed(const Duration(seconds: 2));

    if (data > 20) {
      setFailed('greater than 20', data: data);
    } else {
      setActive(data: data + 1);
    }
  }
}

示例:持久化的状态管理

如果你想在应用重启后仍然保留状态,可以使用 PersistedStateNotifier

class Counter extends PersistedStateNotifier<int, String> {
  Counter() : super(IsarKeyValueStore(), startState: 0);

  void increment() async {
    persistedState = Waiting(data: data);

    await Future.delayed(const Duration(seconds: 2));

    if (data > 20) {
      persistedState = Failed('greater than 20', data: data);
    } else {
      persistedState = Active(data: data + 1);
    }
  }
}

在UI中处理状态变化

只重新构建特定部分

  1. 使用 Flutter 框架中的 ValueListenableBuilder
final counter = Counter();

ValueListenableBuilder(
  valueListenable: counter,
  builder: (context, state, child) {
    return Text(state.data.toString());
  },
  child: const Text('Hello'),
);

你也可以使用 builderArg 辅助函数:

builder: counter.builderArg(
  onActive: (context, data) => Text(data.toString()),
  onWaiting: (context, data) => const CircularProgressIndicator(),
  onNone: (context, data) => const Text('None'),
  onFailure: (context, error, data) => Text('Error: $error'),
),
  1. 使用 StateNotifierBuilder(更用户友好):
final counter = Counter();

counter.builder(
  onActive: (context, data) => Text(data.toString()),
  onWaiting: (context, data) => const CircularProgressIndicator(),
  onNone: (context, data) => const Text('None'),
  onFailure: (context, error, data) => Text('Error: $error'),
);

重新构建整个小部件

将现有的 StatelessWidget 转换为 RStatelessWidget,将 StatefulWidget 转换为 RStatefulWidget,并在 build 方法中调用 watch 方法来监听模型:

class CounterText extends RStatelessWidget {
  @override
  Widget build(BuildContext context) {
    counter.watch(context); // 在 build 方法中调用 watch
    return Text(counter.data.toString());
  }
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_state_management 插件来管理状态:

import 'package:flutter/material.dart';
import 'package:flutter_state_management/flutter_state_management.dart';
import 'package:isar_key_value/isar_key_value.dart';

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

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

  @override
  Widget build(BuildContext context) {
    final counter = createCounter();

    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text('You have pushed the button this many times:'),
              counter.builder(
                selector: (counter) => counter.data,
                onActive: (context, data) => Text(
                  data.toString(),
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
                onWaiting: (_, __) => const CircularProgressIndicator(),
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: counter.increment,
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}

final createCounter = CreateNotifier((arg) => Counter());

class Counter extends PersistedStateNotifier<int, int> {
  Counter() : super(IsarKeyValueStore(), startState: 0);

  // 重写持久化键对于版本控制或区分相同类型的模型很有用
  @override
  String get key => '$runtimeType.1';

  void increment() async {
    setWaiting();
    await Future.delayed(const Duration(seconds: 2));
    setActive(data + 1);
  }
}

class IntCounter extends StateNotifier<int, Error> {
  IntCounter() : super(const Active(data: 0));

  void increment() async {
    setActive(data);

    await Future.delayed(const Duration(seconds: 2));

    if (data > 20) {
      setFailed(StateError('greater than 20'));
    } else {
      setActive(data + 1);
    }
  }
}

class IsarKeyValueStore extends IsarKeyValue implements KeyValueStore {}

通过以上示例,你可以看到如何使用 flutter_state_management 插件来管理应用的状态,并在 UI 中响应状态的变化。希望这个示例对你有所帮助!


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

1 回复

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


当然,下面是一个关于如何使用 flutter_state_management 插件(通常指的是Flutter社区中广泛使用的状态管理库,例如 providerriverpod 等,这里以 provider 为例)的简单代码示例。

使用 provider 进行状态管理

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0  # 请根据最新版本调整

然后运行 flutter pub get 来获取依赖。

2. 创建状态管理类

创建一个简单的状态管理类,比如一个计数器:

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

class Counter with ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

3. 设置 MultiProvider

在你的应用顶层(通常是 MaterialAppCupertinoApp)包裹一个 MultiProvider 来提供状态管理对象:

// main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart';
import 'my_home_page.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => Counter()),
      ],
      child: MyApp(),
    ),
  );
}

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

4. 使用 Consumer 监听状态变化

在你的页面中使用 Consumer 来监听 Counter 的状态变化,并更新UI:

// my_home_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter State Management Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Consumer<Counter>(
              builder: (context, counter, child) {
                return Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          final counter = Provider.of<Counter>(context, listen: false);
          counter.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

总结

以上代码展示了如何使用 provider 库进行状态管理。通过创建一个 ChangeNotifier 子类来管理应用状态,并使用 MultiProviderConsumer 在应用的不同部分中提供和监听这些状态。

这只是一个简单的示例,provider 库还支持更多高级用法,如 SelectorFamily 等,可以帮助你更高效地管理复杂的状态。

回到顶部