Flutter状态管理插件state_store的使用

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

Flutter状态管理插件state_store的使用

简介

state_store 是一个简单的状态管理包,用于Flutter应用。它允许你跨应用维护状态,并为小部件提供状态感知构建器。

特点

  • 跨应用维护状态
  • 状态感知构建器用于小部件
  • 可配置的持久化
  • 监听器的通知
  • 远程状态观察器应用用于调试

使用方法

你可以通过以下步骤来使用 state_store

步骤1:设置状态变量

首先,你需要设置所有需要初始值的状态变量,或者标记为持久化的变量。你也可以定义更复杂的值的导入和导出。

/// 设置状态变量
StateStore.setUp<int>('main.counter', 0, true); // 设置整数类型的初始值
StateStore.setUp<String>('main.text', 'Tiger blood', true); // 设置字符串类型的初始值
StateStore.setUp<Complex>('other.complex', Complex.demo(), true); // 设置复杂对象类型的初始值
StateStore.setUp<TestEnum>('other.other.enum', TestEnum.one, false); // 设置枚举类型的初始值

步骤2:导入持久化的值

使用 import 方法来获取所有已持久化的值。

await StateStore.import();

步骤3:在UI中使用状态感知构建器

使用 StateStoreBuilder 小部件来处理UI中的值变化。

/// 在UI中使用状态感知构建器
StateStoreBuilder(
  id: 'main.counter', // 状态变量的ID
  builder: (context, value) => Text(
    '$value', // 显示状态变量的值
    style: Theme.of(context).textTheme.headlineMedium,
  ),
),

步骤4:更新状态变量

使用 dispatch 方法来更新状态变量。所有监听器和构建器将被通知并更新。

void _incrementCounter() {
  StateStore.dispatch('main.counter', StateStore.get('main.counter') + 1);
}

步骤5:连接远程调试

如果需要使用外部状态调试器,可以启用远程调试功能。这需要socket连接权限。

if (kDebugMode) {
  await StateStore.connectRemoteDebugging(toEncodable: (object) {
    if (object is Enum) return object.name;
    return const JsonEncoder().convert(object);
  });
}

完整示例代码

以下是完整的示例代码,展示了如何使用 state_store 包。

import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:state_store/state_store.dart';

import 'example_complex.dart';

enum TestEnum { one, two, three }

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  /// Step 1: 设置状态变量
  StateStore.setUp<int>('main.counter', 0, true);
  StateStore.setUp<String>('main.text', 'Tiger blood', true);
  StateStore.setUp<Complex>('other.complex', Complex.demo(), true);
  StateStore.setUp<TestEnum>('other.other.enum', TestEnum.one, false);

  /// Step 2: 导入持久化的值
  await StateStore.import();

  /// Step 5: 连接远程调试
  if (kDebugMode) {
    await StateStore.connectRemoteDebugging(toEncodable: (object) {
      if (object is Enum) return object.name;
      return const JsonEncoder().convert(object);
    });
  }

  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  void _incrementCounter() {
    /// Step 4: 更新状态变量
    StateStore.dispatch('main.counter', StateStore.get('main.counter') + 1);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            /// Step 3: 在UI中使用状态感知构建器
            StateStoreBuilder(
              id: 'main.counter',
              builder: (context, value) => Text(
                '$value',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ),
            const SizedBox(height: 20),
            const Text(
              'Random text',
            ),
            const SizedBox(height: 10),
            StateStoreBuilder<String?>(
              id: 'main.text',
              builder: (context, value) => Text(
                value ?? '',
                style: Theme.of(context)
                    .textTheme
                    .titleLarge!
                    .apply(color: Colors.amber),
              ),
            ),
            const SizedBox(height: 20),
            const Text(
              'Complex',
            ),
            const SizedBox(height: 10),
            StateStoreBuilder<Complex?>(
              id: 'other.complex',
              builder: (context, value) => Column(
                children: [
                  Text(
                    value?.id ?? '-',
                    style: Theme.of(context)
                        .textTheme
                        .titleLarge!
                        .apply(color: Colors.amber),
                  ),
                  Text(
                    value?.name ?? '-',
                    style: Theme.of(context)
                        .textTheme
                        .titleLarge!
                        .apply(color: Colors.amber),
                  ),
                  Text(
                    value?.description ?? '-',
                    style: Theme.of(context)
                        .textTheme
                        .titleLarge!
                        .apply(color: Colors.amber),
                  ),
                  Text(
                    value?.numbers.toString() ?? '-',
                    style: Theme.of(context)
                        .textTheme
                        .titleLarge!
                        .apply(color: Colors.amber),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用state_store状态管理插件的示例代码。state_store是一个轻量级的状态管理库,它允许你在Flutter应用中轻松地管理应用状态。

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

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

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

接下来,让我们创建一个简单的Flutter应用,展示如何使用state_store来管理状态。

1. 创建State Store

首先,创建一个新的Dart文件(例如counter_store.dart),并定义一个状态存储类:

import 'package:state_store/state_store.dart';

class CounterStore extends StateStore<int> {
  CounterStore() : super(0);

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

  void decrement() {
    state = state! - 1;
  }
}

2. 使用State Store在Flutter组件中

接下来,在你的主应用文件(例如main.dart)中,使用这个状态存储来管理UI状态:

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

void main() {
  final counterStore = CounterStore();

  runApp(
    StateStoreProvider<int>(
      store: counterStore,
      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 counterStore = StateStoreProvider.of<int>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter State Store Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counterStore.state}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterStore.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

3. 添加Decrement按钮

如果你想添加一个减少按钮,你可以在MyHomePageScaffold中添加另一个FloatingActionButton

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterStore = StateStoreProvider.of<int>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter State Store Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counterStore.state}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () {
              counterStore.increment();
            },
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
          SizedBox(width: 10), // Add some space between buttons
          FloatingActionButton(
            onPressed: () {
              counterStore.decrement();
            },
            tooltip: 'Decrement',
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

这样,你就创建了一个简单的Flutter应用,它使用state_store来管理一个计数器的状态。你可以通过点击增加和减少按钮来改变计数器的值,并且UI会实时更新以反映最新的状态。

回到顶部