标签: flutter-hooks

错误“pumpAndSettle 超时”可能是由于 Riverpod 造成的

我被小部件测试困住了,我可以使用一些帮助
来重现该行为,请运行下面的代码示例

\n
import \'package:flutter/material.dart\';\nimport \'package:hooks_riverpod/hooks_riverpod.dart\';\nimport \'home_page.dart\';\n\nvoid main() => runApp(\n      const ProviderScope(\n        child: MaterialApp(\n          home: Material(\n            child: MyHomePage(),\n          ),\n        ),\n      ),\n    );\n
Run Code Online (Sandbox Code Playgroud)\n
import \'dart:math\';\nimport \'package:flutter/material.dart\';\nimport \'package:flutter_hooks/flutter_hooks.dart\';\nimport \'package:hooks_riverpod/hooks_riverpod.dart\';\n\nextension RoundX on double {\n  double roundToPrecision(int n) {\n    final f = pow(10, n);\n    return (this * f).round() / f;\n  }\n}\n\nfinal tasksPod = Provider<List<Future<void> Function()>>(\n  (ref) => [\n    for (var i = 0; i < 10; ++i)\n      () async {\n        await Future.delayed(kThemeAnimationDuration);\n      }\n  ],\n);\n\nfinal progressPod = Provider.autoDispose<ValueNotifier<double>>((ref) {\n  final notifier = ValueNotifier<double>(0);\n …
Run Code Online (Sandbox Code Playgroud)

dart flutter widget-test-flutter flutter-hooks riverpod

14
推荐指数
2
解决办法
2万
查看次数

如何在flutter中测试showDialog内容?

有没有办法测试显示对话框中的内容?我正在尝试在项目中进行BDD,以下是场景:

As a User, I would like to add a photo or select one from the gallery so that I can use it on the item.

以下是我用来测试它的代码,但由于某种原因,测试失败了。

add_item_view.dart

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:my_app_mobile/models/graded_item/graded_item.dart';
import 'package:my_app_mobile/template/index.dart' as template;
import 'package:image_picker/image_picker.dart';

class AddItemView extends HookWidget {
  final GradedItem gradedItem;
  static final Key photoKey = Key('#photoKey');
  static final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  final void Function() onPhoto;
  final ImagePicker _imagePicker = ImagePicker();

  AddItemView({
    @required this.gradedItem,
    this.onPhoto,
  });

  @override
  Widget build(BuildContext context) …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-test flutter-hooks

9
推荐指数
1
解决办法
5751
查看次数

使用 flutter HookWidget 和 didChangeAppLifecycleState

如何使用HookWidget从特定页面监控应用程序的生命周期状态,就像使用Stateful widget一样?

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
         ...
    }
    if (state == AppLifecycleState.resumed) {
        ...
    }
    if (state == AppLifecycleState.detached) {
       ...
    }
  }
Run Code Online (Sandbox Code Playgroud)

flutter flutter-hooks

7
推荐指数
2
解决办法
5437
查看次数

使用导航和堆栈将多个页面实现为单个页面

在颤,我想使画面像Fragment在Android上,这是我的代码我试图取代每个屏幕为当前屏幕像Fragment.replecae在Android中,我使用HookProvider和我的代码工作正常时,在点击按钮他们,但我之间切换无法实现返回堆栈,这意味着当我点击Back手机上的按钮时,我的代码应该显示我存储到_backStack变量中的最新屏幕,在这个屏幕之间的每个切换我都将当前屏幕索引存储到这个变量中。

我怎样才能在我的示例代码中从这个堆栈中解出?

// Switch Between screens:
DashboardPage(), UserProfilePage(), SearchPage()
------------->   ------------->     ------------->
Run Code Online (Sandbox Code Playgroud)
// When back from stack:
                      DashboardPage(), UserProfilePage(), SearchPage()
Exit from application <--------------  <----------------  <-----------
Run Code Online (Sandbox Code Playgroud)

我使用过Hook并且我想用这个库功能实现这个动作

// Switch Between screens:
DashboardPage(), UserProfilePage(), SearchPage()
------------->   ------------->     ------------->
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-hooks

5
推荐指数
1
解决办法
6399
查看次数

如何在颤动的 useEffect 中显示对话框/ Snackbar?

我试图在 useEffect 挂钩内显示 Snackbar,但它显示错误。如果我理解得很好,我无法从 useEffect 内部访问上下文。那么,我该怎么办呢?

这是错误:“无法侦听 HookState.initState 内继承的小部件。请改用 HookState.build”。

    useEffect(() {

      const snackBar = SnackBar(
        content: Text('Test'),
      );

      ScaffoldMessenger.of(context).showSnackBar(snackBar);

      return;
    }, []);
Run Code Online (Sandbox Code Playgroud)

我正在尝试从 useEffect 内部显示一个对话框。

flutter flutter-hooks

5
推荐指数
1
解决办法
590
查看次数

hooks_riverpod 有用途吗

我有点困惑hooks_riverpod的确切目标是什么,我使用过flutter_riverpod,并且我使用过flutter_hooks,但是 hooks_riverpod 是什么,在 hooks_riverpod 的 pub.dev 主页上,它的文档只是 flutter_riverpod 文档,没有提到钩子,它的语法和功能基本上相同?,我非常困惑,这是一个巨魔包吗?,当我将 hooks_riverpod 导入我的项目并删除 flutter_riverpod 时,没有错误,它只是工作与我以前的 flutter_riverpod 代码。hooks Riverpod 的方式和内容以及文档在哪里,它与 flutter_riverpod 有何不同,因为 flutter Riverpod 基本上甚至具有完整的 hook 功能和额外的功能,这种组合的意义是什么,以及添加到 hook 的证据在哪里flutter_riverpod

flutter flutter-hooks riverpod

4
推荐指数
1
解决办法
796
查看次数

在 Flutter 中创建自定义控制器

我创建了一个名为的小部件InfiniteScroll,它处理异步加载的数据并使用ListView.builder. 但是,我无法为其创建控制器(例如,用于清除所有加载的数据)。我通读了现有控制器的实现,例如TextEditingController但我似乎无法理解它。这是我要实现的目标的示例:

// I have
InfiniteScroll(
  fetchMore: () async {}, // fetching more data
  builder: (data) {}, // building an item
)

// need
InfiniteScroll(
  controller: _infiniteScrollController,
  fetchMore: () async {}, // fetching more data
  builder: (data) {} // building an item
)
// later
_infiniteScrollController.clearItems();
Run Code Online (Sandbox Code Playgroud)

如何创建这样的控制器?flutter_hooks如果这很重要,我将用于本地状态管理。

flutter flutter-hooks

3
推荐指数
2
解决办法
3056
查看次数

带钩子的 Riverpods Flutter - 使用 Provider

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

onPress: () {
           useProvider(genderProvider).state = Gender.female;
           },
Run Code Online (Sandbox Code Playgroud)

我在理解 Riverpods 文档中关于如何使用该提供程序(一旦实现该提供程序)时遇到了一些困难。我理解增量部分.state++,但我找不到初始化后更改状态值的明确示例。正如 x 被初始化为零,但您只想将其设为 42 或输入值。

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

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

enum Gender {
  male,
  female,
  nonBinary
}

final genderProvider = StateProvider((_) => Gender.female);
Run Code Online (Sandbox Code Playgroud)

预先感谢,我感谢任何建议。

flutter flutter-dependencies flutter-state flutter-hooks riverpod

3
推荐指数
1
解决办法
5066
查看次数

Flutter Hooks 和异步调用

前面有一些菜鸟问题。

我在我的应用程序中使用 Flutter Hooks,但在尝试使用带有异步调用的钩子时遇到了困难。

例如,如何通过 useMemoized(或任何其他带钩子的异步数据)获取 SharedPreferences?

SharedPreferences preferences = useMemoized(() async => await SharedPreferences.getInstance());
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用,因为“参数类型‘Future Function()’无法分配给参数类型‘SharedPreferences Function()’。”,但如何完成呢?

我希望存储 SharedPreferences 实例以用于读取和写入值。


下面显示了我如何完成工作的真实示例,但我想知道是否有更好的方法。

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:location/location.dart';
import 'package:shared_preferences/shared_preferences.dart';

class LocationWidget extends HookWidget {
  const LocationWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final Location location = useMemoized(() => Location());
    final ValueNotifier<bool> isLocationEnabled = useState(false);
    final ValueNotifier<bool> isServiceEnabled = useState(false);
    final ValueNotifier<PermissionStatus> permissionStatus = useState(PermissionStatus.denied);

    useEffect(() {
      Future<void>.microtask(() async {
        final SharedPreferences preferences = await SharedPreferences.getInstance();
        isLocationEnabled.value …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-hooks

3
推荐指数
1
解决办法
6827
查看次数

使用useFuture flutter hook时如何重新加载数据

我使用 Flutter hooks 通过组合 useMemorized 和 useFuture 来获取数据,如下所示:

final _latestDocsFuture =
    useMemoized(() => getLatestDocs());
final _latesetDocsSnapshot = useFuture(_latestDocsFuture);
Run Code Online (Sandbox Code Playgroud)

这个钩子的问题是我无法在发生错误时重新触发 useFuture 来重新获取数据(允许用户点击按钮来尝试再次获取数据)。有没有什么方法可以让我重新触发 useFuture 钩子?

dart flutter flutter-hooks

3
推荐指数
1
解决办法
2477
查看次数