Flutter状态管理插件wrap_riverpod的使用

Flutter状态管理插件wrap_riverpod的使用

Wrap_Riverpod

基于riverpod,在Provider的使用上做了一层包装。


Source

river_pod基础操作
https://pub.dev/packages/flutter_riverpod

// 定义一个StateNotifierProvider
final counterProvider = StateNotifierProvider((ref) {
  return Counter(); // 创建Counter实例
});

// Counter类实现StateNotifier
class Counter extends StateNotifier<int> {
  Counter() : super(0); // 初始化状态为0

  void increment() => state++; // 修改状态的方法
}

// 使用Consumer来监听并展示状态
class Example extends ConsumerWidget {
  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider); // 监听counterProvider的状态
    return Text(count.toString()); // 展示状态值
  }
}

Usage

特性

  • StateProvider 可全局定义,层级跨度大的组件仍可通过同一个Provider驱动所依赖到的所有组件进行更新;
  • ViewModel 提供一层包装,内部实现StateProvider。

示例代码

以下是一个完整的示例,展示如何使用wrap_riverpod来管理状态。

引入包

首先确保你已经添加了wrap_riverpod依赖到你的pubspec.yaml文件中:

dependencies:
  wrap_riverpod: ^版本号

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

示例代码

import 'package:flutter/material.dart';
import 'package:wrap_riverpod/wrap_riverpod.dart'; // 引入wrap_riverpod

// 定义一个ViewModel类,继承自ViewModel<T>
class TestViewModel extends ViewModel<int> {
  TestViewModel(int model) : super(model); // 初始化状态

  void increment() {
    model++; // 修改状态
  }

  int get num => model; // 获取当前状态
}

// 使用StatefulWidget来管理ViewModel
class TestViewModelWidgetState extends StatefulWidget {
  [@override](/user/override)
  _TestViewModelWidgetState createState() => _TestViewModelWidgetState();
}

class _TestViewModelWidgetState extends State<TestViewModelWidgetState> {
  final viewModel = TestViewModel(0); // 创建ViewModel实例

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Wrap_Riverpod 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 使用Consumer来监听ViewModel的状态变化
            Consumer(
              builder: (context, ref, child) => CupertinoButton.filled(
                onPressed: () {
                  viewModel[ref] = viewModel.increment(); // 更新状态
                  print('TestViewModelWidgetState.build ${viewModel[ref]}');
                },
                child: Container(
                  width: 120,
                  height: 40,
                  child: Text('Increment ${viewModel[ref]}'), // 显示当前状态
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


wrap_riverpod 是一个基于 Riverpod 的状态管理插件,它提供了一种更简洁、更灵活的方式来管理 Flutter 应用中的状态。RiverpodProvider 的改进版本,提供了更好的类型安全性和更灵活的依赖注入机制。

安装 wrap_riverpod

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

dependencies:
  flutter:
    sdk: flutter
  wrap_riverpod: ^1.0.0

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

基本用法

1. 创建 Provider

Riverpod 使用 Provider 来管理状态。你可以创建一个 Provider 来提供某个状态或服务。

import 'package:wrap_riverpod/wrap_riverpod.dart';

final counterProvider = StateProvider<int>((ref) => 0);

2. 在 Widget 中使用 Provider

你可以使用 ConsumerWidgetConsumer 来访问 Provider 中的状态。

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

class CounterApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Consumer(
            builder: (context, watch, child) {
              final counter = watch(counterProvider).state;
              return Text('Count: $counter');
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            context.read(counterProvider).state++;
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

3. 使用 ProviderScope 包裹应用

为了让 Riverpod 正常工作,你需要在应用的根节点使用 ProviderScope 包裹。

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

void main() {
  runApp(
    ProviderScope(
      child: CounterApp(),
    ),
  );
}

高级用法

1. 使用 StateNotifierProvider

StateNotifierProvider 用于管理更复杂的状态逻辑。你可以创建一个 StateNotifier 类来封装状态和业务逻辑。

import 'package:wrap_riverpod/wrap_riverpod.dart';

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state++;
}

final counterNotifierProvider = StateNotifierProvider<CounterNotifier>((ref) => CounterNotifier());

然后在 Widget 中使用:

class CounterApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Consumer(
            builder: (context, watch, child) {
              final counter = watch(counterNotifierProvider).state;
              return Text('Count: $counter');
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            context.read(counterNotifierProvider.notifier).increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

2. 使用 FutureProviderStreamProvider

FutureProviderStreamProvider 用于处理异步数据。

final futureProvider = FutureProvider<String>((ref) async {
  await Future.delayed(Duration(seconds: 2));
  return 'Hello, Future!';
});

final streamProvider = StreamProvider<int>((ref) {
  return Stream.periodic(Duration(seconds: 1), (i) => i);
});

在 Widget 中使用:

class AsyncDataApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Async Data App')),
        body: Center(
          child: Consumer(
            builder: (context, watch, child) {
              final future = watch(futureProvider);
              final stream = watch(streamProvider);

              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  future.when(
                    data: (data) => Text('Future: $data'),
                    loading: () => CircularProgressIndicator(),
                    error: (error, stack) => Text('Error: $error'),
                  ),
                  stream.when(
                    data: (data) => Text('Stream: $data'),
                    loading: () => CircularProgressIndicator(),
                    error: (error, stack) => Text('Error: $error'),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}
回到顶部