flutter Riverbed - StateNotifierProvider -给予初始值作为参数

r7s23pms  于 2023-04-22  发布在  Flutter
关注(0)|答案(2)|浏览(114)

根据官方文档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);

但我想在初始阶段传递一些值

erhoui1w

erhoui1w1#

使用riverpod2.0的新API传递参数:

final controllerPositionNotifier = NotifierProviderFamily<ControllerPositionNotifier, int, int>(
    ControllerPositionNotifier.new,
  );

class ControllerPositionNotifier extends FamilyNotifier<int, int> {

  @override
  int build(int index) {
    // here you can safely watch on providers
    return index;
  }
}

在小部件中,它看起来像这样:

@override
  Widget build(BuildContext context) {

    int position = ref.watch(controllerPositionNotifier(widget.position));
   
    final PageController controller =
        PageController(initialPage: position);
    ...
}

注意:回调中使用ref.read

ref.read(controllerPositionNotifier(position).notifier).position(index);
6tr1vspr

6tr1vspr2#

为了在进入小部件时提供初始值,我在进入小部件之前更新了提供程序

child: ListView.builder(
                            itemCount: dataValue.length,
                            itemBuilder: (context, index) {
                              return InkWell(
                                  onTap: () {
                                    ref
                                        .watch(
                                            controllerPositionNotifier.notifier)
                                        .position(index);
                                    final result =
                                        Song.fromJson(dataValue[index]);
                                    Navigator.push(
                                        context,
                                        MaterialPageRoute(
                                            builder: (context) => SongWidget(
                                                  resultData: dataValue,
                                                  position: index,
                                                )));
                                  },
                                  child: SongItem(data: dataValue[index]));
                            },
                          ),

我确实在onTap()中更新了值,然后移动到 SongWidget

ref.watch(controllerPositionNotifier.notifier).position(index);

onTap()-方法

return InkWell(onTap: () {
     ref.watch(controllerPositionNotifier.notifier).position(index);
  });

相关问题