我被小部件测试困住了,我可以使用一些帮助
来重现该行为,请运行下面的代码示例
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 );\nRun Code Online (Sandbox Code Playgroud)\nimport \'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) 有没有办法测试显示对话框中的内容?我正在尝试在项目中进行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) 如何使用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) 在颤,我想使画面像Fragment在Android上,这是我的代码我试图取代每个屏幕为当前屏幕像Fragment.replecae在Android中,我使用Hook并Provider和我的代码工作正常时,在点击按钮他们,但我之间切换无法实现返回堆栈,这意味着当我点击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) 我试图在 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 内部显示一个对话框。
我有点困惑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
我创建了一个名为的小部件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如果这很重要,我将用于本地状态管理。
有人可以给出一个在 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
前面有一些菜鸟问题。
我在我的应用程序中使用 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 hooks 通过组合 useMemorized 和 useFuture 来获取数据,如下所示:
final _latestDocsFuture =
useMemoized(() => getLatestDocs());
final _latesetDocsSnapshot = useFuture(_latestDocsFuture);
Run Code Online (Sandbox Code Playgroud)
这个钩子的问题是我无法在发生错误时重新触发 useFuture 来重新获取数据(允许用户点击按钮来尝试再次获取数据)。有没有什么方法可以让我重新触发 useFuture 钩子?