dart 在Flutter中调用notifyListner()后,消费者无法更新

avwztpqn  于 11个月前  发布在  Flutter
关注(0)|答案(1)|浏览(132)

我有一个类,它是with一个ChangeNotifer。当我在这个类中调用一个方法时,我想更新一个列表视图。这是一个类:

class WorkoutProvider with ChangeNotifier
{
  List<Exercise> _workoutList = <Exercise>[];

  ///constructor
  WorkoutProvider();

  ///get&set
  List<Exercise> get workout => _workoutList;

  set workout(List<Exercise> value) {
    _workoutList = value;
  }
  ///removing an exercise to the list
  void removeExercise(Exercise exercise)
  {
    _workoutList.remove(exercise);
    print("deleting");
    notifyListeners();
  }
}

下面是列表视图:

myPro = Provider.of<WorkoutProvider>(context);

body:Consumer<WorkoutProvider>(
        builder: (BuildContext context, WorkoutProvider value, Widget? child)
        {
          print("building cons");
          return ListView.builder(
            padding: EdgeInsets.symmetric(horizontal: 30, vertical: 10),
            itemCount: value.workout.length,
            itemBuilder: (context, index) =>
                Container(
                    margin: EdgeInsets.symmetric(vertical: 3),
                    child: exerciseCard(value.workout.elementAt(index))),
          );
        },
      ),

/// used to delete the exercise from the list of exercises
  Widget buildDeleteExerciseBt(Exercise delExercise)
  {
    return IconButton(
        onPressed: (){
          myPro.removeExercise(delExercise);
        },
        icon: Icon(
          Icons.delete,
          color: Colors.red,
        ));
  }

检查后,它正在从类中删除练习,但UI没有更新。
以下是供应商的注册:

Future<void> main() async {
GlobalContextService.navigatorKey = GlobalKey<NavigatorState>();
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
  MultiProvider(
    providers: [
      Provider<WorkoutProvider>(create: (_) => WorkoutProvider()),
    ],
    child: MaterialApp(
      debugShowCheckedModeBanner: false,
      routes: {
        '/' : (context) => AlreadyLoggedChecker(),
        '/login-screen': (context) => LoginScreen(),
        '/workout-review' : (context) => WorkoutReviewScreen(),
        '/create-training' : (context) => TrainingCreateScreen(),
      },
      initialRoute: '/',
    ),
  ),
);

}
我试着放一些print(),所以当调用notifylistners()的方法时,消费者不会被构建。

u5rb5r59

u5rb5r591#

显然,在main中注册提供程序时,我应该使用ChangeNotifierProvider而不是Provider

相关问题