FittedBox 与 Consumer 一起使用时会引发错误。 '宽度> 0.0':不正确

发布于 2025-01-14 03:40:18 字数 4538 浏览 3 评论 0原文

该代码在不使用 ChangeNotifierProvider 类的 Consumer 的情况下工作正常,但当我访问 ChangeNotifier 类中定义的变量时,该代码将无法工作。这意味着每当变量更新时,代码都会抛出一个指向 FittedBox 的错误。

断言失败:第 319 行 pos 12:'width > 0.0':不是真的。单击错误链接时指向 FittedBox。

我正在分享代码,无论有没有问题。

这很好用。

class SupervisedByButton extends StatelessWidget {
  const SupervisedByButton({
    Key? key,
    required this.uid
  }) : super(key: key);

  final String uid;
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(create: (context)=>SupervisedByButtonVM(uid),
    builder: (context,viewModel)
      {
        return Consumer<SupervisedByButtonVM>(
          builder: (context,vm,child)
          {
            return Container(
              height: 50.h,
              width: 140.w,
              decoration: BoxDecoration(
                color: kSupervisedByColor,

              ),
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 5.w),
                child: Column(
              children: [
                Flexible(
                  child: FittedBox(
                    child: Text(
                      "Supervised by",
                      style: kPoppinsLight300.copyWith(
                        fontSize: 12.sp,
                        color: kWhiteColor,
                      ),
                    ),
                  ),
                ),
                Flexible(
                  child:
                     FittedBox(
                       child: Text(
                          "My Name", //this work fine
                          style: kPoppinsMedium500.copyWith(
                            fontSize: 15.sp,
                            color: kWhiteColor,

                          ),
                        ),
                     )

                )
              ],

            ),
              ),
            );
          }
         
        );
      },);
  }
}

这行不通。

class SupervisedByButton extends StatelessWidget {
  const SupervisedByButton({
    Key? key,
    required this.uid
  }) : super(key: key);

  final String uid;
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(create: (context)=>SupervisedByButtonVM(uid),
    builder: (context,viewModel)
      {
        return Consumer<SupervisedByButtonVM>(
          builder: (context,vm,child)
          {
            return Container(
              height: 50.h,
              width: 140.w,
              decoration: BoxDecoration(
                color: kSupervisedByColor,

              ),
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 5.w),
                child: Column(
              children: [
                Flexible(
                  child: FittedBox(
                    child: Text(
                      "Supervised by",
                      style: kPoppinsLight300.copyWith(
                        fontSize: 12.sp,
                        color: kWhiteColor,
                      ),
                    ),
                  ),
                ),
                Flexible(
                  child:
                     FittedBox(
                       child: Text(
                          vm.getUserName, //this won't work and throws error
                          style: kPoppinsMedium500.copyWith(
                            fontSize: 15.sp,
                            color: kWhiteColor,

                          ),
                        ),
                     )

                )
              ],

            ),
              ),
            );
          }
         
        );
      },);
  }
}

这是 ChangeNotifier 类

class SupervisedByButtonVM extends ChangeNotifier{
  final UserProfileService _userProfileService=GetIt.I.get<UserProfileService>();
  String _userName="";
  final Logger _logger=Logger();

  SupervisedByButtonVM(String uid)
  {
    userName(uid);
  }
  Future userName(String uid)async
  {
    try{
      print("uid of teacher is $uid");
      UserSignupModel _userSignupModel;
      _userSignupModel=await _userProfileService.getProfileDocument(uid,"teacher");
      setUserName=_userSignupModel.fullName??"Unknown";
    }
    catch(error)
    {
      _logger.e("error at SupervisedByButtonVM /userName.dart $error");

    }



  }

  String get getUserName=>_userName;

  set setUserName(String user)
  {
    _userName=user;
    notifyListeners();
  }
}

The code works fine without using the Consumer of ChangeNotifierProvider class but won't work when I accessed the variable defined in the ChangeNotifier class. This means whenever the variable is updated the code throws an error that is pointed towards the FittedBox.

Failed assertion: line 319 pos 12: 'width > 0.0': is not true. Points towards FittedBox when clicked on error link.

I'm sharing the code with and without a problem.

This works fine.

class SupervisedByButton extends StatelessWidget {
  const SupervisedByButton({
    Key? key,
    required this.uid
  }) : super(key: key);

  final String uid;
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(create: (context)=>SupervisedByButtonVM(uid),
    builder: (context,viewModel)
      {
        return Consumer<SupervisedByButtonVM>(
          builder: (context,vm,child)
          {
            return Container(
              height: 50.h,
              width: 140.w,
              decoration: BoxDecoration(
                color: kSupervisedByColor,

              ),
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 5.w),
                child: Column(
              children: [
                Flexible(
                  child: FittedBox(
                    child: Text(
                      "Supervised by",
                      style: kPoppinsLight300.copyWith(
                        fontSize: 12.sp,
                        color: kWhiteColor,
                      ),
                    ),
                  ),
                ),
                Flexible(
                  child:
                     FittedBox(
                       child: Text(
                          "My Name", //this work fine
                          style: kPoppinsMedium500.copyWith(
                            fontSize: 15.sp,
                            color: kWhiteColor,

                          ),
                        ),
                     )

                )
              ],

            ),
              ),
            );
          }
         
        );
      },);
  }
}

This won't' work.

class SupervisedByButton extends StatelessWidget {
  const SupervisedByButton({
    Key? key,
    required this.uid
  }) : super(key: key);

  final String uid;
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(create: (context)=>SupervisedByButtonVM(uid),
    builder: (context,viewModel)
      {
        return Consumer<SupervisedByButtonVM>(
          builder: (context,vm,child)
          {
            return Container(
              height: 50.h,
              width: 140.w,
              decoration: BoxDecoration(
                color: kSupervisedByColor,

              ),
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 5.w),
                child: Column(
              children: [
                Flexible(
                  child: FittedBox(
                    child: Text(
                      "Supervised by",
                      style: kPoppinsLight300.copyWith(
                        fontSize: 12.sp,
                        color: kWhiteColor,
                      ),
                    ),
                  ),
                ),
                Flexible(
                  child:
                     FittedBox(
                       child: Text(
                          vm.getUserName, //this won't work and throws error
                          style: kPoppinsMedium500.copyWith(
                            fontSize: 15.sp,
                            color: kWhiteColor,

                          ),
                        ),
                     )

                )
              ],

            ),
              ),
            );
          }
         
        );
      },);
  }
}

Here is the ChangeNotifier Class

class SupervisedByButtonVM extends ChangeNotifier{
  final UserProfileService _userProfileService=GetIt.I.get<UserProfileService>();
  String _userName="";
  final Logger _logger=Logger();

  SupervisedByButtonVM(String uid)
  {
    userName(uid);
  }
  Future userName(String uid)async
  {
    try{
      print("uid of teacher is $uid");
      UserSignupModel _userSignupModel;
      _userSignupModel=await _userProfileService.getProfileDocument(uid,"teacher");
      setUserName=_userSignupModel.fullName??"Unknown";
    }
    catch(error)
    {
      _logger.e("error at SupervisedByButtonVM /userName.dart $error");

    }



  }

  String get getUserName=>_userName;

  set setUserName(String user)
  {
    _userName=user;
    notifyListeners();
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文