You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用Provider切换OTP页面Widget无效,求排查指导

问题排查与修复

1. Widget切换逻辑完全写反

你当前的判断逻辑和需求完全相反:当isPhoneNumberEntered为true时,反而显示手机号输入Widget,只有状态为false时才显示验证码Widget,这直接导致输入手机号后无法切换到目标界面。

原错误逻辑:

viewModel.isPhoneNumberEntered
    ? fillPhoneNumberWidget
    : otpVerificationWidget,

修复后:

viewModel.isPhoneNumberEntered
    ? otpVerificationWidget
    : fillPhoneNumberWidget,

2. Consumer未正确绑定ViewModel实例

你的Consumer没有指定泛型类型,也没有使用builder回调提供的ViewModel实例,而是直接引用外部的viewModel变量。这会导致Consumer无法监听ViewModel的状态变化,即使调用notifyListeners(),UI也不会触发刷新。

原错误代码:

Consumer(
    builder: (BuildContext context, value, Widget? child) {
    return ResponsiveHelperWidget(
        mobile: viewModel.isPhoneNumberEntered
            ? fillPhoneNumberWidget
            : otpVerificationWidget,
        // ... desktop布局
    );
    },
),

修复后(指定泛型并使用回调内的实例):

Consumer<OTPViewModel>(
    builder: (BuildContext context, otpViewModel, Widget? child) {
    return ResponsiveHelperWidget(
        mobile: otpViewModel.isPhoneNumberEntered
            ? otpVerificationWidget
            : fillPhoneNumberWidget,
        desktop: Row(
        children: [
            const Expanded(child: OTPWebPageFillerWidget()),
            Expanded(child: fillPhoneNumberWidget),
        ],
        ),
    );
    },
),

额外验证点

确保你的ViewModel已经通过ChangeNotifierProvider正确注入到Widget树中,比如页面父级存在类似代码:

ChangeNotifierProvider(
  create: (context) => OTPViewModel(),
  child: OTPPage(),
)

内容的提问来源于stack exchange,提问作者Jaimin Modi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:22:40