栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Flutter在initState方法中获取上下文

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Flutter在initState方法中获取上下文

成员变量上下文可以在期间访问,

initState
但不能用于所有内容。这是从
initState
文档中扑朔迷离的:

您不能使用

[BuildContext.inheritFromWidgetOfExactType]
此方法。但是,
[didChangeDependencies]
将在此方法之后立即调用,
[BuildContext.inheritFromWidgetOfExactType]

并可在此方法中使用。

您可以将初始化逻辑移至

didChangeDependencies
,但是这可能并非您真正想要的,因为
didChangeDependencies
在小部件的生命周期中可以多次调用它。

如果您改为进行异步调用,该调用将您的调用委派给您,直到初始化小部件之后,您就可以根据需要使用上下文了。

一个简单的方法就是利用未来。

Future.delayed(Duration.zero,() {  ... showDialog(context, ....)}

另一种可能更“正确”的方法是使用flutter的调度程序添加后帧回调:

SchedulerBinding.instance.addPostframeCallback((_) {  ... showDialog(context, ....)});

最后,这是我想在initState函数中使用异步调用的一个小技巧:

() async {  await Future.delayed(Duration.zero);  ... showDialog(context, ...)      }();

这是使用简单的Future.delayed的充实示例:

import 'dart:async';import 'package:flutter/material.dart';void main() => runApp(new MyApp());class MyApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    return MaterialApp(      title: 'Flutter Demo',      theme: ThemeData(        primarySwatch: Colors.blue,      ),      home: MyHomePage(title: 'Flutter Demo Home Page'),    );  }}class MyHomePage extends StatefulWidget {  MyHomePage({Key key, this.title}) : super(key: key);  final String title;  @override  _MyHomePageState createState() => _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> {  int _counter = 0;  bool _checkConfiguration() => true;  void initState() {    super.initState();    if (_checkConfiguration()) {      Future.delayed(Duration.zero,() {        showDialog(context: context, builder: (context) => alertDialog(          content: Column( children: <Widget>[   Text('@todo') ],          ),          actions: <Widget>[ FlatButton(onPressed: (){   Navigator.pop(context); }, child: Text('OK')),          ],        ));      });    }  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text(widget.title),      ),      body: Center(        child: Column( mainAxisAlignment: MainAxisAlignment.center,          children: <Widget>[ Text(   'You have pushed the button this many times:', ), Text(   '$_counter',   style: Theme.of(context).textTheme.display1, ),          ],        ),      ),    );  }}

注释中提供了OP的更多背景信息,对于他们的特定问题,我可以给出稍微更好的解决方案。根据应用程序的不同,您实际上可能要根据显示的页面来做出决定,具体取决于是否是第一次打开该应用程序,即设置

home
为其他内容。对话框并不一定是移动设备上最好的UI元素。最好显示整页以及他们需要添加的设置和下一个按钮。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372769.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号