【问题标题】:Async Data Initialization in initStateinitState 中的异步数据初始化
【发布时间】:2022-01-25 13:19:49
【问题描述】:

我正在调用异步方法 getMyLocation() 以在我的 initState() 中获取我的当前位置。该方法可能需要一段时间...

我想了解 initState() 在这些情况下的行为。该方法是否仍然在 build() 渲染时在后台执行,或者 initState() 是否超时,因为它需要在 build() 渲染之前完成?

在我的 build() 中,我有一个语句检查我的纬度是否为空,在这种情况下,我返回一个 Loading() 小部件。有时 Screen() 渲染,有时 Loading() 无限期地进行。我假设有时 getMyLocation() 在 initState() 期间成功执行,有时它会超时?

  @override
  void initState() {
    super.initState();
    final userData = Provider.of<MyUser>(context, listen: false);
    final myUser = userData.getUser();
    userData.getMyLocation();
  }

  getMyLocation() async {
    _myUser.longitude = await getCurrentLongitude();
    _myUser.latitute = await getCurrentLatitude();
    notifyListeners();
  }

Widget build(BuildContext context) {
final userData = Provider.of<MyUser>(context);
final myUser = userData.getUser();
myUser.latitude == null?
return Loading() 
: return Screen()

【问题讨论】:

    标签: flutter


    【解决方案1】:

    很好的问题。首先,initState() 同步运行,它准备了build() 方法正常运行所需的各种东西。如果你在这里执行一些async 函数,它只会返回一个Future,因为你不能在initState()await 它。在您的情况下,您可能需要FutureBuilder。处理期货的“正确方式”是这样的:

    class MyWidget extends StatefulWidget {
      const MyWidget({Key? key}) : super(key: key);
    
      @override
      State<MyWidget> createState() => _MyWidgetState();
    }
    
    class _MyWidgetState extends State<MyWidget> {
    
      Future<void> getMyLocation() async {
        final userData = Provider.of<MyUser>(context, listen: false);
        final myUser = await userData.getUser();
        // if getUser() is async then we have to await
        myUser.longitude = await getCurrentLongitude();
        myUser.latitute = await getCurrentLatitude();
        // notifyListeners();
        // You probably do not need this, should be done in provider methods instead
      }
    
      Widget build(BuildContext context) {
        return FutureBuilder(
          future: getMyLocation(), 
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return SomeErrorWidget();
            }
    
            if (snapshot.hasData) {
              return Screen(snapshot.data);
            }
    
            return SomeLoadingWidget();
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2018-06-04
      • 2021-08-17
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      相关资源
      最近更新 更多