Flutter中如何在jsession_id变量非空时自动执行getTasks函数
方案1:等待鉴权完成再渲染Home页(最推荐,逻辑最简洁)
你的authentification本质是异步操作,你可以等它执行完成、jsession_id赋值成功后再渲染MyHomePage,未完成阶段展示加载占位页:
- 改造
_MyAppState逻辑:
class _MyAppState extends State<MyApp> { P3provider? _p3provider; @override void initState() { super.initState(); _initAuthentication(); } Future<void> _initAuthentication() async { final p3provider = P3provider(); // 给authentification加await,等待异步鉴权完成、jsession_id赋值成功 await authentification(p3provider); setState(() { _p3provider = p3provider; }); } @override Widget build(BuildContext context) { return MaterialApp( // 鉴权未完成时展示加载页,完成后再渲染MyHomePage home: _p3provider == null ? const Scaffold(body: Center(child: CircularProgressIndicator())) : MyHomePage(p3provider: _p3provider!), ); } }
- 此时
MyHomePage初始化时p3provider的jsession_id已经赋值完成,直接在initState调用getTasks()即可,不需要任何额外判断:
@override void initState() { super.initState(); getTasks(); }
方案2:用ValueNotifier监听jsession_id变化(无需改上层渲染逻辑)
如果不需要鉴权阶段单独加加载页,可以给P3provider的jsession_id加可监听属性,值变化时自动触发方法:
- 改造
P3provider类,把jsession_id封装为ValueNotifier:
class P3provider { // 改为可监听的ValueNotifier,初始值为null final ValueNotifier<String?> jsessionId = ValueNotifier(null); // 其余原有逻辑不变,鉴权成功后给jsessionId.value赋值即可 }
- 在
_MyHomePageState中监听值变化:
class _MyHomePageState extends State<MyHomePage> { late VoidCallback _jsessionListener; @override void initState() { super.initState(); // 若已经初始化完成直接调用 if (widget.p3provider.jsessionId.value != null) { getTasks(); return; } // 注册监听,jsession_id赋值后自动触发 _jsessionListener = () { if (widget.p3provider.jsessionId.value != null) { getTasks(); // 调用完成后移除监听器避免内存泄漏 widget.p3provider.jsessionId.removeListener(_jsessionListener); } }; widget.p3provider.jsessionId.addListener(_jsessionListener); } @override void dispose() { // 页面销毁时移除监听器 widget.p3provider.jsessionId.removeListener(_jsessionListener); super.dispose(); } }
注意事项
- 如果你原本的
authentification方法没有返回Future,需要先把它改造为异步方法,鉴权逻辑执行完成后再结束Future,否则await不会生效。 - 如果项目已经引入了
Provider、Riverpod、Bloc之类的状态管理组件,直接复用现有状态监听逻辑即可,不需要单独加ValueNotifier。
内容的提问来源于stack exchange,提问作者JS1
相关产品推荐
相关产品推荐

