Flutter临时状态管理插件ephemeral_state_manager的使用

Flutter临时状态管理插件ephemeral_state_manager的使用

ephemeral_state_manager 是一个简单的、目标明确的临时状态管理包(它是一个状态短暂的widget),通过这个包可以安全地使用 setStatestreamController,指示应该构建哪些可变的widget,而无需重新构建整个页面的widget树,这与框架文档推荐的方式一致。

  • 不需要使用注解来标识变量是可变的或可观察的。
  • 不需要使用代码生成器。
  • StateSetterBuilderStateSetterBuilderKey 小部件是自动可释放的。
  • 使用 ValuesStream(Streamcontroller) 的页面可以通过依赖管理器、StatefulWidgetdispose() 方法或 StatelessWidgetWillPopScopeNavigator.maybePop(context) 进行释放。
  • 根据框架文档,当我们使用完全隔离的具有可变值的小部件,并且仅重建必要的部分时,组件的渲染性能会得到优化。
  • 包内的示例文件夹中有四个更详细的用法示例。

使用StateSetterBuilder

// 控制方法和属性
class PageStateSetterBuilderController {
  final ValuesState<int> counter = ValuesState<int>(0);

  void increment() => counter.value++; // 增加计数器值

  void decrement() => counter.value--; // 减少计数器值
}

// 使用setState更新的小部件
StateSetterBuilder<int>(
  valueStateSetter: controller.counter, // 绑定到计数器状态
  builder: (context, value) {
    print('更新计数器值');
    return Text(
      '$value', // 显示当前计数器值
      style: Theme.of(context).textTheme.headline4,
    );
  }
),

使用StateSetterBuilderKey

// 控制方法和属性
class PageStateSetterBuilderKeyController extends StateSetterValues {
  int counter = 0;

  void increment() =>
      super.updateValue(stateSetterKey: "counter", data: counter++); // 更新计数器值

  void decrement() =>
      super.updateValue(stateSetterKey: "counter", data: counter--); // 更新计数器值
}

// 使用setState更新的小部件
StateSetterBuilderKey<PageStateSetterBuilderKeyController>(
  objectInstance: controller, // 绑定控制器实例
  stateSetterKey: "counter", // 指定键名
  builder: (context, object) {
    print('更新键值: 计数器');
    return Text(
      '${object.counter}', // 显示当前计数器值
      style: Theme.of(context).textTheme.headline4,
    );
  }
),

使用StreamBuilder

// 控制方法和属性
class PageValueStreamController extends Disposeble {
  final ValuesStream<int> counter = ValuesStream<int>(0);

  void incrementCounter() => counter.value++; // 增加计数器值
  void decrementCounter() => counter.value--; // 减少计数器值

  [@override](/user/override)
  void dispose() => counter.dispose(); // 释放资源
}

// 使用StreamController更新的小部件
StreamBuilder<int>(
  stream: controller.counter.stream, // 绑定到流
  initialData: controller.counter.value, // 初始数据
  builder: (context, snapshot) {
    print('更新数据: ${snapshot.data}'); // 打印更新数据
    return Text(
      '${snapshot.data}', // 显示当前数据
      style: Theme.of(context).textTheme.headline4,
    );
  },
),

完整示例

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "App",
      theme: ThemeData(primaryColor: Colors.indigo),
      home: HomePage(),    
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final Controller controller = Controller(); // 创建控制器实例

    print('创建HomePage构建');
    return Scaffold(
      appBar: AppBar(
        title: const Text('示例使用StateSetterBuilder')
      ),
      body: Center(
        child: Row(
           mainAxisAlignment: MainAxisAlignment.spaceAround,
           children: [
             IconButton(
               icon: Icon(Icons.exposure_neg_1, size: 45.0, color: Theme.of(context).primaryColor), 
               onPressed: controller.decrement, // 点击减少计数器
             ),
             StateSetterBuilder<int>(
               valueStateSetter: controller.counter, // 绑定计数器状态
               builder: (context, value){
                 print('更新计数器值');
                 return Text(
                   '$value', // 显示当前计数器值
                   style: Theme.of(context).textTheme.headline4,
                 );
               }
             ),
             IconButton(
               icon: Icon(Icons.exposure_plus_1, size: 45.0, color: Theme.of(context).primaryColor), 
               onPressed: controller.increment, // 点击增加计数器
             ),
           ],
         ),
      ),
    );
  }
}

class Controller {

  final ValueState<int> counter = ValueState<int>(0); // 初始化计数器状态

  void increment() => counter.value++; // 增加计数器值

  void decrement() => counter.value--; // 减少计数器值
}

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

1 回复

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


当然,下面是一个关于如何使用 ephemeral_state_manager 这个 Flutter 临时状态管理插件的代码示例。ephemeral_state_manager 插件允许你在 Flutter 应用中轻松管理临时状态,这对于需要在组件之间快速传递和更新数据的情况特别有用。

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

dependencies:
  flutter:
    sdk: flutter
  ephemeral_state_manager: ^latest_version  # 请替换为最新版本号

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

示例代码

下面是一个简单的 Flutter 应用示例,展示了如何使用 ephemeral_state_manager 来管理临时状态。

1. 创建状态管理器

首先,创建一个简单的状态管理器类,用于存储和更新临时状态。

// ephemeral_state_manager_example.dart
import 'package:ephemeral_state_manager/ephemeral_state_manager.dart';

class MyEphemeralState extends EphemeralState {
  final String message;

  MyEphemeralState({required this.message});

  MyEphemeralState copyWith({String? message}) {
    return MyEphemeralState(
      message: message ?? this.message,
    );
  }
}

2. 使用状态管理器

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

// main.dart
import 'package:flutter/material.dart';
import 'package:ephemeral_state_manager/ephemeral_state_manager.dart';
import 'ephemeral_state_manager_example.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> with EphemeralStateMixin<MyEphemeralState> {
  @override
  void initState() {
    super.initState();
    // 初始化状态
    ephemeralState = MyEphemeralState(message: "Hello, Flutter!");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Ephemeral State Manager Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              ephemeralState?.message ?? "Loading...",
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 更新状态
                updateEphemeralState(
                  (state) => state?.copyWith(message: "State Updated!"),
                );
              },
              child: Text("Update State"),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 创建状态管理器

    • MyEphemeralState 类继承自 EphemeralState,并包含一个 message 属性。
    • copyWith 方法用于创建当前状态的副本,并允许修改某些属性。
  2. 使用状态管理器

    • HomeScreen 类使用 EphemeralStateMixin<MyEphemeralState> 来混入临时状态管理功能。
    • initState 方法中,初始化 ephemeralStateMyEphemeralState 的一个实例。
    • build 方法中,使用 ephemeralState?.message 来显示当前状态的消息。
    • 使用 ElevatedButton 触发状态更新,updateEphemeralState 方法用于更新临时状态。

这样,你就成功地使用 ephemeral_state_manager 插件在 Flutter 应用中管理临时状态了。这个插件非常适合用于需要在组件之间快速传递和更新临时数据的场景。

回到顶部