Flutter状态管理辅助插件state_helpers的使用

Flutter状态管理辅助插件state_helpers的使用

特性

  • 创建和处理StatefulWidget更优雅。
  • Bloc管理系统助手。
  • 辅助范围扩展函数。

开始使用

安装
flutter pub add state_helpers

使用

在Flutter中更简单地创建StatefulWidget

我们通常需要编写两个类来创建一个StatefulWidget:

import 'package:flutter/material.dart';  
  
class Counter extends StatefulWidget {  
  const Counter({super.key});  
  
  [@override](/user/override)  
  State<StatefulWidget> createState() => _SimpleCounterState();  
}  
  
class _SimpleCounterState extends State<Counter> {  
  var count = 0;  
  
  [@override](/user/override)  
  Widget build(BuildContext context) {  
    return Row(  
      children: [  
        TextButton(onPressed: () {  
          setState(() {  
            count--;  
          });  
        }, child: const Text('-')),  
        Text('value: $count'),  
        TextButton(  
            onPressed: () {  
              setState(() {  
                count++;  
              });  
            },  
            child: const Text('+')  
        )  
      ],  
    );  
  }  
}

使用state_helpers库,可以简化为一个类,并使用StateHolder混入:

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

class SimpleCounter extends StatefulWidget with StateHolder<int> {  
  const SimpleCounter({super.key});  

  [@override](/user/override)  
  int get initialState => 0;  

  [@override](/user/override)  
  Widget build(BuildContext context, int state, StateEmitter<int> emitter) {  
    return Row(  
      children: [  
        TextButton(onPressed: () {  
          emitter(state - 1);  
        }, child: const Text('-')),  
        Text('value: $state'),  
        TextButton(  
            onPressed: () {  
             emitter(state + 1);  
            },  
            child: const Text('+')  
        )  
      ],  
    );  
  }  
}
更简便地创建BlocBuilder和BlocSelector

避免记住多个类型来创建BlocSelectorBlocBuilder

import 'package:example/widgets/bloc/color_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return BlocSelector<ColorBloc, ColorData, String>(
        selector: (st) => st.name,
        builder: (context, snapshot) => Text(snapshot)
    );
  }
}

bloc实例直接创建buildersselectors

import 'package:example/widgets/bloc/color_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return context.read<ColorBloc>().selector(
        selector: (st) => st.color,
        builder: (context, snapshot) =>
            Container(height: 64, color: snapshot,)
    );
  }
}

示例代码

import 'package:example/widgets/app.dart';
import 'package:flutter/material.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      themeMode: ThemeMode.system,
      darkTheme: ThemeData.dark(),
      home: const App(),
    );
  }
}

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

1 回复

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


state_helpers 是一个用于 Flutter 状态管理的辅助插件,旨在简化状态管理的复杂性,提供一些实用工具和方法来更轻松地管理应用程序的状态。虽然它不是一个官方或广泛使用的插件,但它的目标是帮助开发者更高效地处理状态管理问题。

以下是如何使用 state_helpers 插件的基本指南:

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  state_helpers: ^0.1.0  # 请确保使用最新版本

然后,运行 flutter pub get 来安装插件。

2. 基本用法

state_helpers 提供了一些工具类和函数来帮助你管理状态。以下是一些常见的用法示例:

状态管理辅助工具

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('State Helpers Example')),
        body: StateHelperWidget(),
      ),
    );
  }
}

class StateHelperWidget extends StatefulWidget {
  [@override](/user/override)
  _StateHelperWidgetState createState() => _StateHelperWidgetState();
}

class _StateHelperWidgetState extends State<StateHelperWidget> with StateHelper {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            'You have pushed the button this many times:',
          ),
          Text(
            '$_counter',
            style: Theme.of(context).textTheme.headline4,
          ),
          ElevatedButton(
            onPressed: _incrementCounter,
            child: Text('Increment'),
          ),
        ],
      ),
    );
  }
}

在上面的例子中,StateHelper mixin 被用于 _StateHelperWidgetState 类中,以简化状态管理。使用 setState 可以轻松地更新 UI。

3. 状态监听

state_helpers 还可能提供状态监听的功能,允许你在状态发生变化时执行某些操作。你可以使用 StateListener 或类似的工具来监听状态变化。

class _StateHelperWidgetState extends State<StateHelperWidget> with StateHelper {
  int _counter = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    addListener(_onStateChange);
  }

  void _onStateChange() {
    print('State changed: $_counter');
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  void dispose() {
    removeListener(_onStateChange);
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            'You have pushed the button this many times:',
          ),
          Text(
            '$_counter',
            style: Theme.of(context).textTheme.headline4,
          ),
          ElevatedButton(
            onPressed: _incrementCounter,
            child: Text('Increment'),
          ),
        ],
      ),
    );
  }
}
回到顶部