首页 > 解决方案 > setState 仅在我再次调用该操作后才重建页面

问题描述

我想从另一个页面(类)添加一个项目,它有点像我看到项目出现,在我再次按下按钮之后,就在第二个页面再次加载之前。这很奇怪,它看起来只有当我再次按下按钮时才会设置状态。如果我在 _WorkoutListState 类中添加项目,它会起作用。

class WorkoutList extends StatefulWidget {
  WorkoutList({Key? key}) : super(key: key);
  @override
  _WorkoutListState createState() => _WorkoutListState();
}

class _WorkoutListState extends State<WorkoutList> {
  List<Workout> workouts = List<Workout>.empty(growable: true);

  @override
  void initState() {
    super.initState();
    workouts.add(Workout(name: 'up'));
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: Scaffold(
      body: Column(children: <Widget>[
        Text('Workouts'),
        Expanded(
          child: ListView.builder(
              itemCount: workouts.length,
              itemBuilder: (context, index) {
                return WorkoutListItem(
                  excercise: workouts[index],
                );
              }),
        ),
      ]),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => (AddWorkout(
                        workout: (workout) => workouts.add(workout),
                      ))));
          setState(() {});
        },
        tooltip: 'Add',
        child: Icon(Icons.add),
      ),
    ));
  }
}

和另一页

class AddWorkout extends StatefulWidget {
  final Function(Workout) workout;

  AddWorkout({Key? key, required this.workout}) : super(key: key);

  @override
  _AddWorkoutState createState() => _AddWorkoutState();
}

class _AddWorkoutState extends State<AddWorkout> {
  void _addWorkout() {
    widget.workout(Workout(name: 'down'));
    Navigator.pop(context);
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: Scaffold(
      body: Column(
        children: [Text('adadad')],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addWorkout,
      ),
    ));
  }
}

标签: flutterdart

解决方案


我使用 Navigator 的返回值功能修复了它

这是第一个 onPressed

onPressed: () async {
          Workout workout = await Navigator.push(
              context, MaterialPageRoute(builder: (context) => (AddWorkout())));
          workouts.add(workout);
          setState(() {});
        },

第二个

onPressed: () => Navigator.pop(context, Workout(name: 'down')),

推荐阅读