Flutter状态管理插件simple_state的使用

Flutter状态管理插件simple_state的使用

简介

什么是SimpleState?

它是一个Flutter包,使得应用程序的反应式数据可以轻松连接到用户界面。

安装

pubspec.yaml文件中添加依赖:

dependencies:
  simple_state: [latest-version]

使用

简单的可观察对象

为了处理最简单的对象,我们使用Observable<T>,它可以通知观察者值的变化,但不会处理集合或对象内容的变化。

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

void main() => runApp(
      MaterialApp(
        home: SimpleObservable(),
      ),
    );

class SimpleObservable extends StatelessWidget {
  SimpleObservable({super.key});

  final _simpleObservable = Observable('Hello');

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // 观察者每次监听到变化时都会触发
          child: Observer(
            builder: (_) => Text(_simpleObservable.value),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.flutter_dash),
          // 更改可观察对象的值
          onPressed: () => _simpleObservable.value += '\nWorld',
        ),
      ),
    );
  }
}

集合的可观察对象

为了处理集合,实现了三个类:ObservableList<T>ObservableMap<K,V>ObservableSet<T>。当向集合中添加/更改/删除元素时,观察者会收到通知。

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

void main() => runApp(
      MaterialApp(
        home: CollectionsObservable(),
      ),
    );

class CollectionsObservable extends StatelessWidget {
  CollectionsObservable({super.key});

  final _listObservable = ObservableList([0]);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // 观察者每次监听到变化时都会触发
          child: Observer(
            builder: (_) => ListView.builder(
              itemCount: _listObservable.length,
              itemBuilder: (_, i) => Text(_listObservable[i].toString()),
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.flutter_dash),
          // 向可观察列表添加元素
          onPressed: () => _listObservable.add(_listObservable.length),
        ),
      ),
    );
  }
}

自定义的可观察对象

你也可以实现复杂的对象,这些对象可以通知观察者它们的变化。

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

void main() => runApp(
      MaterialApp(
        home: CustomObservable(),
      ),
    );

class CustomTitleObservable extends ChangeNotifier {
  CustomTitleObservable([String? title]) : _title = title;

  String? _title;

  String get title => _title ?? '';

  set title(String value) {
    _title = value;

    notifyListeners();
  }
}

class CustomObservable extends StatelessWidget {
  CustomObservable({super.key});

  late final _customObservable = CustomTitleObservable('#');

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // 观察者每次监听到变化时都会触发
          child: Observer(
            builder: (_) => Text(_customObservable.title),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.flutter_dash),
          // 更改自定义可观察对象的值
          onPressed: () => _customObservable.title += '!',
        ),
      ),
    );
  }
}

反应

反应本质上是对变化的订阅。你可以创建一个反应 Reaction.when,它返回一个类型为 Reaction 的对象。要移除反应,必须调用 removeListeners()。你还可以创建异步反应 Reaction.asyncWhen。你也可以在小部件树中使用 ReactionWidget 小部件来使用反应。

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

void main() => runApp(
      const MaterialApp(
        home: ReactionObservable(),
      ),
    );

class ReactionObservable extends StatefulWidget {
  const ReactionObservable({super.key});

  [@override](/user/override)
  _ReactionObservableState createState() => _ReactionObservableState();
}

class _ReactionObservableState extends State<ReactionObservable> {
  late final _exampleMap = ObservableMap<int, String>({});

  late final Reaction _reaction;

  [@override](/user/override)
  void initState() {
    // 创建一个反应,当映射长度达到五个元素时清空映射
    _reaction = Reaction.when(
      condition: () => _exampleMap.length == 5,
      reaction: _exampleMap.clear,
    );

    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    // 删除反应订阅
    _reaction.removeListeners();

    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // 观察者每次监听到变化时都会触发
          child: Observer(
            builder: (_) => ListView.builder(
              itemCount: _exampleMap.length,
              itemBuilder: (_, i) => Text(_exampleMap[i] ?? ''),
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.flutter_dash),
          // 向可观察映射添加元素
          onPressed: () => _exampleMap[_exampleMap.length] = 'Item ${_exampleMap.length}',
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用simple_state插件进行状态管理的一个简单示例。simple_state是一个轻量级的状态管理库,它允许你轻松地管理应用的状态。

1. 添加依赖

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

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

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

2. 创建状态类

接下来,你需要创建一个状态类。这个类将包含你想要管理的状态数据以及任何更新状态的方法。

import 'package:simple_state/simple_state.dart';

class CounterState extends State<int> {
  CounterState() : super(0);

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

在这个例子中,CounterState管理一个整数值,并提供了一个increment方法来增加这个值。

3. 在小部件中使用状态

现在,你可以在你的Flutter小部件中使用这个状态类。你需要使用Provider来包裹你的应用或特定的小部件树,并使用consume来访问和监听状态的变化。

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

void main() {
  runApp(
    Provider<CounterState>.value(
      value: CounterState(),
      child: MyApp(),
    ),
  );
}

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterState = consume<CounterState>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counterState.state}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          final counterState = consume<CounterState>();
          counterState.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个例子中,我们创建了一个简单的Flutter应用,其中包含一个按钮和一个显示计数的文本。当按钮被按下时,CounterStateincrement方法被调用,从而更新状态,并且由于consume的使用,UI会自动重新渲染以反映新的状态。

注意事项

  • simple_stateprovider库一起使用,因此你需要确保你的项目中已经包含了provider库的依赖。
  • 使用consume来获取状态时,如果状态在树的更高层没有被提供,它将抛出一个错误。因此,确保你的Provider正确包裹了你的应用或相关的小部件树。

希望这个示例能帮助你理解如何在Flutter项目中使用simple_state进行状态管理。

回到顶部