Flutter状态管理插件unistate_provider的使用

Flutter状态管理插件unistate_provider的使用

unistate_provider 是一个用于Flutter的状态管理解决方案,它采用了provider模式,并且支持ValueListenable。以下是关于如何使用unistate_provider的一些关键信息。

特性

  • 简单的provider模式实现
  • 支持与ValueListenable集成
  • 提供上下文扩展以进行观察(watch)和读取(read)操作
  • 类型安全的状态管理

使用方法

基本Provider使用

// 使用静态方法
final value = UnistateProvider.of<int>(context);

其他信息

此包是Unistate生态系统的一部分,旨在与unistate_adapter无缝协作。

完整示例

以下是一个完整的示例,展示了如何在Flutter应用中使用unistate_provider

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    MultiUniState(
      notifiers: [
        // 可以在这里添加不同的notifiers
      ],
      child: const MyApp(),
    ),
  );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final counterBloc = CounterBloc();
    final counterCubit = CounterCubit();
    final counterProvider = CounterProvider();
    debugPrint('build CounterPage');
    return Scaffold(
      appBar: AppBar(title: const Text('Counter')),
      body: Column(
        spacing: 20,
        children: [
          const NotifierCounterDisplay(),
          ValueListenableBuilder(
              valueListenable: counterProvider,
              builder: (context, state, child) {
                return Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text('Provider: $state'),
                      const SizedBox(height: 20),
                    ],
                  ),
                );
              }),
          ValueListenableBuilder(
              valueListenable: counterCubit,
              builder: (context, state, child) {
                return Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text('Cubit: $state'),
                      const SizedBox(height: 20),
                    ],
                  ),
                );
              }),
          ValueListenableBuilder(
            valueListenable: counterBloc,
            builder: (context, state, child) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('Bloc: $state'),
                    const SizedBox(height: 20),
                  ],
                ),
              );
            },
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              ElevatedButton(
                onPressed: () {
                  counterBloc.add(Increment());
                  counterCubit.increment();
                  counterProvider.value++;
                  context.read<CounterProvider>()?.increment();
                },
                child: const Text('Increment'),
              ),
              ElevatedButton(
                onPressed: () {
                  counterBloc.add(Decrement());
                  counterCubit.decrement();
                  counterProvider.decrement();
                  context.read<CounterProvider>()?.decrement();
                },
                child: const Text('Decrement'),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    debugPrint('build NotifierCounterDisplay');
    final counterNotifier = context.watch<CounterProvider>();
    return Text(
      'Counter: ${counterNotifier?.value ?? 0}',
      style: TextStyle(fontSize: 24),
    );
  }
}

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

1 回复

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


unistate_provider 是一个轻量级的 Flutter 状态管理插件,它结合了 ProviderUniState 的概念,专注于简化状态管理的复杂性。通过 unistate_provider,你可以轻松地在 Flutter 应用中管理和共享状态。

安装

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

dependencies:
  flutter:
    sdk: flutter
  unistate_provider: ^1.0.0  # 请使用最新版本

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

基本用法

1. 创建状态管理类

首先,你需要创建一个状态管理类,这个类将负责管理和更新状态。你可以通过继承 UniState 来实现。

import 'package:unistate_provider/unistate_provider.dart';

class CounterState extends UniState {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners(); // 通知监听者状态已更新
  }
}

2. 在应用顶层提供状态

在你的应用的顶层(通常是 MaterialApp 的父级),使用 UniStateProvider 来提供状态管理类的实例。

import 'package:flutter/material.dart';
import 'package:unistate_provider/unistate_provider.dart';
import 'counter_state.dart'; // 导入你创建的状态管理类

void main() {
  runApp(
    UniStateProvider(
      create: (_) => CounterState(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'UniStateProvider Example',
      home: CounterScreen(),
    );
  }
}

3. 在页面中使用状态

在需要使用状态的页面或组件中,你可以通过 UniStateProvider.of<T>(context) 来获取状态管理类的实例,并监听状态的变化。

import 'package:flutter/material.dart';
import 'package:unistate_provider/unistate_provider.dart';
import 'counter_state.dart';

class CounterScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final counterState = UniStateProvider.of<CounterState>(context);

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