首页 > 解决方案 > Riverpods with hooks Flutter - 使用 Provider

问题描述

有人可以举一个最好使用riverpod_hooks在Riverpods中进行额外状态修改的示例 - 我希望能够在不制作额外小部件的情况下使用它,例如:

onPress: () {
           useProvider(genderProvider).state = Gender.female;
           },

我在理解 Riverpods 文档中关于在实施后使用提供程序方面有点困难。我了解增量部分 .state++,但我找不到初始化后更改状态值的明确示例。如 x 初始化为零,但您只想将其设为 42 或输入值。

例如,我有一个 Gender {male, female, non-binary} 的枚举,并且我创建了一个 GenderProvider,但我无法找出能够使用按钮在我的应用程序中更改性别的最佳方法。我也不完全确定 Provider 和 RiverPods 有多少相似之处,似乎有很多语义差异?

这就是当前在我的代码中声明提供程序的方式:

enum Gender {
  male,
  female,
  nonBinary
}

final genderProvider = StateProvider((_) => Gender.female);

在此先感谢,我很感激任何建议。

标签: flutterflutter-dependenciesriverpodflutter-stateflutter-hooks

解决方案


onPress: () => context.read(genderProvider).state = Gender.female,

在此处输入图像描述

完整源代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

void main() {
  runApp(
    ProviderScope(
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        home: HomePage(),
      ),
    ),
  );
}

class HomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final gender = useProvider(genderProvider).state;
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Gender: ${describeEnum(gender)}'),
            const SizedBox(height: 16.0),
            ElevatedButton(
              child: Text('MALE'),
              onPressed: () => context.read(genderProvider).state = Gender.male,
            ),
            const SizedBox(height: 8.0),
            ElevatedButton(
              child: Text('FEMALE'),
              onPressed: () =>
                  context.read(genderProvider).state = Gender.female,
            ),
          ],
        ),
      ),
    );
  }
}

enum Gender { male, female, nonBinary }

final genderProvider = StateProvider((_) => Gender.female);

推荐阅读