我有一堂课是
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(),这样当调用具有 notificationlistners() 的方法时,消费者就不会构建。
显然,在
ChangeNotifierProvider
中注册提供商时,我应该使用 Provider
而不是 main
。