Flutter/Riverpod:UI 不会随着 StateNotifierProvider 内的状态变化而更新

问题描述

当我知道状态正在改变时,我的应用程序的 UI 没有更新。我正在使用 Riverpod 的 watch 方法来处理此问题,但除非我进行热重新加载,否则更改不会生效。

我有一个类 HabitListStateNotifier,其中包含从列表中添加/删除习惯的方法:

class HabitListStateNotifier extends StateNotifier<List<Habit>> {
  HabitListStateNotifier(state) : super(state ?? []);

  void startAddNewHabit(BuildContext context) {
    showModalBottomSheet(
        context: context,builder: (_) {
          return NewHabit();
        });
  }

  void addNewHabit(String title) {
    final newHabit = Habit(title: title);
    state.add(newHabit);
  }

  void deleteHabit(String id) {
    state.removeWhere((habit) => habit.id == id);
  }
}

这里是提供者:

final habitsProvider = StateNotifierProvider(
  (ref) => HabitListStateNotifier(
    [
      Habit(title: 'Example Habit'),],),);

HabitList(未更新的 UI 部分)的实现方式如下:

class HabitList extends ConsumerWidget {
  @override
  Widget build(BuildContext context,ScopedReader watch) {
    final habitList = watch(habitsProvider.state);

    /////////////not updating/////////////
    return ListView.builder(
      shrinkWrap: true,scrollDirection: Axis.vertical,itemBuilder: (context,index) {
        return HabitCard(
          habit: habitList[index],);
      },itemCount: habitList.length,);
    /////////////not updating/////////////
  }
}

最后是 HabitCardHabitList 的组成部分):

class HabitCard extends StatelessWidget {
  final Habit habit;

  HabitCard({@required this.habit});

  @override
  Widget build(BuildContext context) {

    /////////////function in question/////////////
    void deleteHabit() {
      context.read(habitsProvider).deleteHabit(habit.id);
    }
    /////////////function in question/////////////

    return Card(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(devHeight * 0.03),color: Colors.grey[350],elevation: 3,child: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
              HabitTitle(
                title: habit.title,Consumer(
                builder: (context,watch,child) => IconButton(
                  padding: EdgeInsets.all(8),icon: Icon(Icons.delete),/////////////function in question/////////////
                  onPressed: deleteHabit,/////////////function in question/////////////
                ),);
  }
}

当我按下 HabitCard 中的删除图标时,我知道 Habit 正在从列表中删除,但更改并未反映在 UI 中。但是,当我进行热重载时,它会按预期消失。我在这里做错了什么?

解决方法

我不知道这是否是处理事情的正确方式,但我想通了。在 cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0 ln -sf universal-darwin20 universal-darwin19 中,对于 HabitListStateNotifieraddNewHabit,我添加了这行代码:到最后:deleteHabit 并且它完全按照我想要的方式工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...