Flutter轻量级状态管理插件lite_state的使用

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

Flutter轻量级状态管理插件lite_state的使用

简介

Flutter Lite State 是一个极其轻量的状态管理库,它帮助开发者在不需要依赖任何重量级库的情况下轻松控制小部件的状态。Lite State非常适合那些希望快速启动项目而不必编写大量样板代码、不想依赖BuildContext或不希望在一个地方拥有过多功能的开发者。

Pub Package Effective Dart Awesome Flutter

特点

  • 不需要上下文即可轻松控制小部件的状态。
  • 通过继承LiteStateController类来创建控制器,所有魔法都在内部发生。
  • 支持延迟初始化和即时初始化两种方式。
  • 可以方便地将数据存储到SharedPreferences中,并且可以在应用启动时恢复这些数据。

快速开始

创建控制器

首先我们需要创建一个继承自LiteStateController的控制器类:

import 'package:lite_state/lite_state.dart';

class AuthController extends LiteStateController<AuthController> {
  // 控制器逻辑...
}

初始化控制器

接下来,在应用程序启动时初始化控制器:

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  @override
  void initState() {
    initJsonDecoders({
      AuthData: AuthData.decode, // 如果有需要持久化的数据类型,则在此处注册解码器
    });

    initControllersLazy({
      AuthController: () => AuthController(),
      LoaderController: () => LoaderController(),
    });
    super.initState();
  }

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

使用LiteState构建UI

然后就可以在任何地方使用LiteState来构建UI了:

Widget build(BuildContext context) {
  return LiteState<AuthController>(
    builder: (BuildContext c, AuthController controller) {
      return Scaffold(
        body: Center(
          child: Column(
            children: [
              Text('Welcome, ${controller.userName}'),
              Button(
                text: controller.isAuthorized ? 'Log Out' : 'Authorize',
                onPressed: () {
                  if (controller.isAuthorized) {
                    findController<AuthController>().logout();
                  } else {
                    findController<AuthController>().authorize();
                  }
                },
              ),
            ],
          ),
        ),
      );
    },
  );
}

单次使用的控制器

如果需要创建一个仅在特定范围内使用的控制器,可以这样做:

return LiteState<SingleUseController>(
  controller: SingleUseController(),
  builder: (BuildContext c, SingleUseController controller) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Single Use Controller'),
      ),
      body: Center(
        child: Column(
          children: [
            Text(
              controller.counter.toString(),
              style: const TextStyle(fontSize: 50.0),
            ),
            Button(
              text: 'Update Counter',
              onPressed: () {
                controller.counter++;
              },
            ),
          ],
        ),
      ),
    );
  },
);

多个隔离控制器

当同一个类型的多个控制器实例不会相互冲突时,可以通过设置useIsolatedController参数为true来实现:

LiteState<ControllerForMultiControllerSetup>(
  controller: _controller1,
  useIsolatedController: true,
  builder: (BuildContext c, ControllerForMultiControllerSetup controller) {
    // ...
  },
),

持久化数据

为了使某些数据能够在应用程序重启后仍然存在,我们可以利用SharedPreferences进行数据的保存与读取。首先定义一个实现了LSJsonEncodable接口的数据类:

class AuthData implements LSJsonEncodable {
  String type;
  String token;
  String userName;

  AuthData({
    required this.type,
    required this.token,
    required this.userName,
  });

  @override
  Map encode() {
    return {
      'type': type,
      'token': token,
      'userName': userName,
    };
  }

  static AuthData decode(Map map) {
    return AuthData(
      type: map['type'],
      token: map['token'],
      userName: map['userName'],
    );
  }
}

接着在控制器中定义相关属性:

class AuthController extends LiteStateController<AuthController> {
  AuthData? get authData {
    return getPersistentValue<AuthData>('authData');
  }

  set authData(AuthData? value) {
    setPersistentValue<AuthData>('authData', value);
  }

  String get userName {
    return authData?.userName ?? 'Guest';
  }
}

最后不要忘记在initState()方法中初始化解码器:

initJsonDecoders({
  AuthData: AuthData.decode,
});

这样就完成了对AuthData对象的持久化支持。更多完整示例请参考官方提供的example项目


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

1 回复

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


当然,以下是如何在Flutter项目中使用lite_state插件进行轻量级状态管理的代码示例。lite_state是一个简单而有效的状态管理库,适合在小型到中型Flutter应用中使用。

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

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

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

代码示例

1. 创建状态类

首先,创建一个简单的状态类,用来存储和管理应用的状态。

import 'package:lite_state/lite_state.dart';

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

  void increment() {
    value++;
    notifyListeners();
  }
}

2. 创建UI组件

接下来,创建一个使用CounterState的UI组件。

import 'package:flutter/material.dart';
import 'package:lite_state/lite_state.dart';
import 'counter_state.dart'; // 假设你的状态类在counter_state.dart文件中

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LiteStateProvider<CounterState>(
        create: () => CounterState(),
        child: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterState = LiteStateProvider.of<CounterState>(context);

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

解释

  1. 状态类 (CounterState):

    • 继承自LiteState<int>,其中int是状态的类型。
    • 构造函数初始化状态为0。
    • increment方法增加状态值并通知监听器(UI组件)。
  2. 主应用 (MyApp):

    • 使用MaterialApp创建一个Flutter应用。
    • 使用LiteStateProvider包装CounterScreen,并提供CounterState实例。
  3. UI组件 (CounterScreen):

    • 使用LiteStateProvider.of<CounterState>(context)获取状态实例。
    • 显示当前状态值,并提供一个按钮来增加状态值。

通过这种方式,你可以轻松地在Flutter应用中使用lite_state进行轻量级状态管理。这个库非常适合小型到中型应用,因为它避免了Provider、Riverpod或Bloc等更复杂状态管理库的开销。

回到顶部