[英]How to use a Riverpod provider in initState
我在我的 web 应用程序中使用 Riverpod 作为 state 管理。 我正在尝试构建一个自动滚动到 ListView 的某些部分的 AppBar。
为此,我创建了一个 ScrollController 作为提供者。
final scrollControllerProvider = StateProvider<ScrollController?>((ref) => ScrollController());
要滚动,我使用 AppBar 操作中的.animateTo
。
ref.read(scrollControllerProvider)!.animateTo(
0,
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
);
滚动有效,但会引发异常
The provided ScrollController is currently attached to more than one ScrollPosition.
我读过我应该使用 StatefulWidget。 但是,使用 ConsumerStatefulWidget 我无法使用 Riverpod 创建 ScrollController,因为我需要在initState()
中启动它并且我无法从它访问提供程序。 有可能将这两个元素放在一起吗?
class MyClass extends ConsumerStatefulWidget {
const MyClass({Key? key}) : super(key: key);
@override
ConsumerState<MyClass> createState() => _MyClassState();
}
class _MyClassState extends ConsumerState<MyClass> {
late ScrollController _scrollController;
@override
void initState() {
super.initState();
_scrollController = ScrollController();
}
@override
Widget build(BuildContext context) {
final status = ref.watch(someProvider);
return ListView(
controller: _scrollController,
);
}
}
您可以访问位于ConsumerStatefulWidget
中的任何 function 中的ref
。 所以,你可以简单地在initState()
function 中调用你的提供者,它应该表现正常
...
class _MyClassState extends ConsumerState<MyClass> {
late ScrollController _scrollController;
@override
void initState() {
super.initState();
_scrollController = ref.watch(scrollControllerProvider); // Doesn't throw error
}
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.