根据官方文档StateNotifierProvider它工作正常,但我有一个场景在初始阶段传递一些值,流程是这样的,我有一个项目列表,点击它后,它将被重定向到详细信息屏幕,当用户向左或向右滑动时,PageView.builder标题已更新,当用户滑动页面时,它工作正常,但是当用户点击列表中的第三个项目时,我想显示所选项目的标题,所以我想将初始位置传递给StateNotifierProvider
类ControllerPositionNotifier扩展StateNotifier {finalcurrentPosition;
ControllerPositionNotifier(this.currentPosition) : super(currentPosition);
int position(int position) {
return state = position;
}
}
当我进入widget**ControllerPositionNotifier(MY_ARG)**时,我想传递一个my值
final controllerPositionNotifier = StateNotifierProvider<ControllerPositionNotifier, int>((ref) {
return ControllerPositionNotifier(0);
});
查看寻呼机屏幕
class SongWidget extends ConsumerStatefulWidget {
final List<dynamic>? resultData;
final int position;
const SongWidget({Key? key, required this.resultData, required this.position})
: super(key: key);
@override
_SongWidgetState createState() => _SongWidgetState();
}
class _SongWidgetState extends ConsumerState<SongWidget> {
@override
Widget build(BuildContext context) {
final songs = widget.resultData?.map((e) => Song.fromJson(e)).toList() ??
List<Song>.empty();
int position = ref.watch(controllerPositionNotifier);
// HERE I WANT TO PASS ON MY ARGUMENT widget.position
final PageController controller =
PageController(initialPage: widget.position);
print('_SongWidgetState');
return Scaffold(
appBar: AppBar(
title: Text(songs[position].sTitle ?? '--'),
),
body: PageView.builder(
controller: controller,
itemCount: songs.length,
onPageChanged: (index) {
print('position: $index');
ref.watch(controllerPositionNotifier.notifier).position(index);
},
itemBuilder: (context, index) {
return SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Text(
songs[index].sSong ?? '--',
),
)
],
),
);
},
),
);
}
}
这一行在初始阶段已经更新
appBar: AppBar(
title: Text(songs[position].sTitle ?? '--'),
)
刷卡更新成功后
ref.watch(controllerPositionNotifier.notifier).position(index);
但我想在初始阶段传递一些值
2条答案
按热度按时间erhoui1w1#
使用riverpod2.0的新API传递参数:
在小部件中,它看起来像这样:
注意:回调中使用
ref.read
6tr1vspr2#
为了在进入小部件时提供初始值,我在进入小部件之前更新了提供程序
我确实在onTap()中更新了值,然后移动到 SongWidget
onTap()-方法