flutter UI页面导航

llmtgqce  于 2023-03-13  发布在  Flutter
关注(0)|答案(2)|浏览(156)

PlanDaysExList是一个包含锻炼练习的列表,如果列表为空......它应该将我导航到restScreen()/如果列表包含练习......它应该将我导航到getPlanExercisesScreen()
我的问题是,当列表有练习或空...它总是导航我到getPlanExercisesScreen(),我不知道问题在哪里。
下面是我代码:

Widget DaysDetails(context,index,weekNum) => InkWell(
    onTap: ()
    {
      LifeStyleCubit.get(context).PlanDaysExList=[];
      LifeStyleCubit.get(context).getPlanDaysExercises(
            planName: model.planName,
            weekNum: weekNum+1,
            dayNum: index + 1,
        );
        if(LifeStyleCubit.get(context).PlanDaysExList==[])
          {Navigator.push(context, MaterialPageRoute(
              builder: (context)=>restScreen()));}
        else{Navigator.push(context, MaterialPageRoute(
            builder: (context)=>getPlanExercisesScreen()));}

    },
    child: SizedBox(
      height: 35,width: 100,
      child: Container(
        color: Colors.orange,
        child: Center(child: Text('Day ${index+1}')),
      ),
    ),
  );
void getPlanDaysExercises({
    required int weekNum, required int dayNum,
    required String planName,
  })
  {
    FirebaseFirestore.instance
        .collection('users')
        .doc(uId)
        .collection('plans')
        .doc(planName)
        .collection('week $weekNum')
        .doc('week $weekNum')
        .collection('days')
        .get()
        .then((value){
      PlanDaysExList.clear();
      value.docs.forEach((element)
      {
        if(element.data()['day'] == dayNum)
        {
          PlanDaysExList.add(PlanExercisesModel.fromJson(element.data()));
        }
      });

在最后一行代码中,这意味着如果docs.element.data[day]与dayNum不匹配,则PlanDaysExList必须为空,但它仍会将我导航到getPlanExercisesScreen(),但是当我导航到那里时......它不会向我显示练习,因此意味着列表为空!我错过了什么?

zaqlnxep

zaqlnxep1#

错误出现在检查列表是否为空的行中。

if(LifeStyleCubit.get(context).PlanDaysExList==[])

将其更改为:

if(LifeStyleCubit.get(context).PlanDaysExList.isEmpty)

用一个更简单的例子来尝试:

ElevatedButton(
  onPressed: () {
    //Change this if condition check
    if (list1.isEmpty) {
      log('List is empty.');
    } else {
      log('List is not empty.');
    }
  },
  child: const Text('Press'),
),

在这里,我用列表的isEmpty方法替换了if(list1 == [](在您的示例中)。
原因是,如果不检查ListEquality(从collection.dart导入),就无法像在Python中那样比较列表:

import 'package:collection/collection.dart';
final list1 = [];
final Function listEquality = const ListEquality().equals;

@override
Widget build(BuildContext context) {
  return ElevatedButton(
    onPressed: () {
      //This if now validates
      if (listEquality(list1, [])) {
        log('empty');
      } else {
        log('not empty');
      }
    },
    child: const Text('Press'),
  );
}
vmjh9lq9

vmjh9lq92#

若要检查列表是否为空,可以改用列表的isEmpty属性,如下所示:LifeStyleCubit.get(context).PlanDaysExList.isEmpty。如果列表没有元素,则此属性返回true,否则返回false。
尝试将DaysDetails小部件中的比较更改为使用isEmpty,如下所示:

if (LifeStyleCubit.get(context).PlanDaysExList.isEmpty) {
  Navigator.push(context, MaterialPageRoute(builder: (context) => restScreen()));
} else {
  Navigator.push(context, MaterialPageRoute(builder: (context) => getPlanExercisesScreen()));
}

相关问题