Flutter状态属性管理插件stateful_props的使用

Flutter状态属性管理插件stateful_props的使用

stateful_props 是一个用于简化 StatefulWidget 状态管理的插件,提供了多种预定义的属性类(Props),帮助开发者更高效地处理常见的Flutter用例。本文将介绍如何安装和使用这个插件,并提供完整的示例代码。

🔨 安装

pubspec.yaml 文件中添加依赖:

dependencies:
  stateful_props: ^1.2.0

⚙ 导入

在需要使用的文件中导入 stateful_props 包:

import 'package:stateful_props/stateful_props.dart';

🕹️ 基本使用

stateful_props 提供了多种预定义的 Props 类,例如 AnimationControllerProp, FocusNodeProp, FutureProp, IntProp, DoubleProp, StringProp, BoolProp, PageControllerProp, ScrollControllerProp, StreamProp, StreamControllerProp, TabControllerProp, TextEditingControllerProp 等等。

这些 Props 类通常会自动处理值变化时调用 setState 和必要的 dispose 操作。

示例:使用 AnimationControllerProp

以下是一个简单的例子,展示如何使用 AnimationControllerProp 来管理 AnimationController

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> with StatefulPropsMixin {
  late final _anim = AnimationControllerProp(this, duration: Duration(seconds: 1), autoBuild: true);

  @override
  Widget build(BuildContext context) {
    return Opacity(
      opacity: _anim.controller.value,
      child: Container(
        color: Colors.blue,
        width: 100,
        height: 100,
      ),
    );
  }
}

在这个例子中,我们不需要手动监听动画的变化或调用 dispose() 方法,因为 AnimationControllerProp 已经帮我们处理好了。

🕹️🕹️ 高级使用

创建新的 Props

可以通过扩展 StatefulProp 类来创建自定义的 Prop:

class MyCustomProp extends StatefulProp {
  MyCustomProp(StatefulPropsManager manager) : super(manager);

  @override
  void didChangeDependencies() {}

  @override
  void dispose() {}

  @override
  void didUpdateWidget(covariant StatefulWidget oldWidget) {}

  @override
  void activate() {}

  @override
  void deactivate() {}
}

通常情况下,只需在构造函数中初始化一些状态,并在 dispose() 中清理资源即可:

class FooControllerProp extends StatefulProp {
  FooControllerProp(StatefulPropsManager manager, {bool autoBuild = false}) : super(manager) {
    // setup
    controller = FooController();
    if (autoBuild) controller.addListener(manager.scheduleBuild);
  }

  late final FooController controller;

  @override
  void dispose() {
    // tear down
    controller.dispose();
  }
}

重用状态逻辑

Props 可以封装任意数量的逻辑和状态,方便在多个小部件之间共享或隔离进行测试。例如,可以提取登录相关的通用行为到 LoginBehaviorProp

class LoginBehaviorProp extends StatefulProp {
  LoginBehaviorProp(StatefulPropsManager manager) : super(manager);
  late final _emailText = TextEditingControllerProp(manager);
  late final _passwordText = TextEditingControllerProp(manager);
  late final _showPassword = BoolProp(manager); // rebuilds when changed

  TextEditingController get emailCtrl => _emailText.controller;
  TextEditingController get passwordCtrl => _passwordText.controller;
  bool get showPassword => _showPassword.value;

  void submit() => print('login logic goes here, talk to services models etc.');

  void toggleShowPassword() => _showPassword.value = !showPassword;
}

然后可以在任何 StatefulWidget 中使用这个 Prop:

class MyView extends StatefulWidget {
  @override
  _MyViewState createState() => _MyViewState();
}

class _MyViewState extends State<MyView> with StatefulPropsMixin {
  late final _login = LoginBehaviorProp(this);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextFormField(controller: _login.emailCtrl),
        TextFormField(
          controller: _login.passwordCtrl,
          obscureText: !_login.showPassword,
        ),
        ElevatedButton(onPressed: _login.submit, child: Text('Submit')),
      ],
    );
  }
}

示例项目

下面是一个完整的示例项目,展示了如何使用 stateful_props 插件来管理不同的控制器和状态:

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

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

class App extends StatefulWidget {
  const App({Key? key}) : super(key: key);

  List<Widget> get children => [
        LogicReuseDemo(),
        FuturePropDemo(),
        ValuePropDemo(),
        AnimationsDemo(),
        FocusDemo(),
        PageControllerDemo(),
        ScrollControllerDemo(),
        TextEditingDemo(),
        StreamDemo(),
      ];

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> with StatefulPropsMixin {
  late final _tabs = TabControllerProp(this, length: widget.children.length);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            Expanded(
              child: TabBarView(
                controller: _tabs.controller,
                children: widget.children.map((e) => Center(child: e)).toList(),
              ),
            ),
            TabBar(
              controller: _tabs.controller,
              tabs: List.generate(
                widget.children.length,
                (i) => Text(
                  widget.children[i].toString().replaceFirst('Demo', ''),
                  style: TextStyle(color: Colors.black, fontSize: 12),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

以上是 stateful_props 的基本使用方法和一些高级用法。通过使用该插件,可以大大简化状态管理的工作,提高代码的可读性和健壮性。


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

1 回复

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


当然,以下是一个关于如何使用 stateful_props 插件在 Flutter 中管理状态属性的示例代码。stateful_props 是一个轻量级的状态管理库,它允许你将组件的状态提升为全局可访问的属性。

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

dependencies:
  flutter:
    sdk: flutter
  stateful_props: ^最新版本号  # 请替换为当前最新版本号

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

以下是一个简单的示例,展示如何使用 stateful_props 管理一个计数器的状态:

1. 创建 CounterProp

首先,定义一个 CounterProp 类来表示计数器的状态属性:

import 'package:stateful_props/stateful_props.dart';

class CounterProp extends StatefulProp<int> {
  CounterProp() : super(0);
}

2. 设置全局 Props 实例

在你的应用入口文件(通常是 main.dart)中,设置全局的 Props 实例:

import 'package:flutter/material.dart';
import 'package:stateful_props/stateful_props.dart';
import 'counter_prop.dart';  // 导入你定义的 CounterProp 类

void main() {
  // 创建 Props 实例并注册 CounterProp
  final props = Props()
    ..register(CounterProp());

  runApp(MyApp(props: props));
}

class MyApp extends StatelessWidget {
  final Props props;

  MyApp({required this.props});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Stateful Props Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(props: props),
    );
  }
}

3. 使用 Props 管理状态

在你的主页中,使用 Props 来访问和更新 CounterProp 的状态:

import 'package:flutter/material.dart';
import 'package:stateful_props/stateful_props.dart';
import 'counter_prop.dart';  // 导入你定义的 CounterProp 类

class MyHomePage extends StatelessWidget {
  final Props props;

  MyHomePage({required this.props});

  void _incrementCounter() {
    // 更新 CounterProp 的值
    props.get<CounterProp>().update((value) => value + 1);
  }

  @override
  Widget build(BuildContext context) {
    // 访问 CounterProp 的当前值
    final counterValue = props.get<CounterProp>().value;

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Stateful Props Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$counterValue',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

总结

在这个示例中,我们展示了如何使用 stateful_props 插件来管理一个计数器的状态。首先,我们定义了一个 CounterProp 类来表示计数器的状态。然后,在应用的入口文件中,我们创建了一个全局的 Props 实例并注册了 CounterProp。最后,在主页中,我们通过 Props 实例访问和更新了计数器的状态。

这个示例展示了 stateful_props 的基本用法,你可以根据需要扩展它来处理更复杂的状态管理场景。

回到顶部