Asynchronous 将异步数据(GPS协调)从FutureBuilder传递给提供商/设置异步构造函数

Asynchronous 将异步数据(GPS协调)从FutureBuilder传递给提供商/设置异步构造函数,asynchronous,flutter,dart,flutter-provider,Asynchronous,Flutter,Dart,Flutter Provider,我在处理异步数据(即用户GPS协调)输入时遇到问题 我将我的应用程序简化为下面的计算器应用程序,它通过以下方式管理状态(双精度) 2) 然后,在Rémi Rousselet的解决方案中, 我试图修改MyProvider构造函数,但失败了,因为我无法使构造函数异步 3) 现在我想做一个FutureProvider来注入ChangeNotifierProvider,但我真的很怀疑 在这一点上,我觉得我是在与框架和软件包作斗争,而不是让它们帮助我,所以我希望你能给我一些建议。经过一段时间的睡眠后,我

我在处理
异步
数据(即用户GPS协调)输入时遇到问题

我将我的应用程序简化为下面的计算器应用程序,它通过以下方式管理状态(双精度)

2) 然后,在Rémi Rousselet的解决方案中, 我试图修改
MyProvider
构造函数,但失败了,因为我无法使构造函数异步

3) 现在我想做一个
FutureProvider
来注入
ChangeNotifierProvider
,但我真的很怀疑


在这一点上,我觉得我是在与框架和软件包作斗争,而不是让它们帮助我,所以我希望你能给我一些建议。

经过一段时间的睡眠后,我觉得可以通过检查snapshot.data简单地解决这个问题

        return snapshot.hasData
            ? ProviderApp(snapshot.data.latitude)
            : Center(child: CircularProgressIndicator());
import 'dart:ffi';
import 'dart:async';
import 'package:geolocator/geolocator.dart';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(TreeTop());

class TreeTop extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Gps gps = Gps();

    return FutureBuilder(
      future: gps.currentPosition,
      // initialData: Position(latitude: 20.0),
      builder: (context, snapshot) {
        return ProviderApp(snapshot.data.latitude);
      },
    );
  }
}

class ProviderApp extends StatelessWidget {
  final double myNum;
  ProviderApp(this.myNum);
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyProvider>(
      create: (_) => MyProvider(myNum),
      child: CalApp(),
    );
  }
}

class CalApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final myProvider = Provider.of<MyProvider>(context);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(myProvider.getMyProvider().toString()),
              RaisedButton(
                child: Text('increase 10%'),
                onPressed: () {
                  myProvider.userProvider();
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

class MyProvider with ChangeNotifier {
  double _myProvider;
  MyProvider(this._myProvider);

  double getMyProvider() => _myProvider;

  void userProvider() {
    _myProvider *= 1.1;
    notifyListeners();
  }
}

class Gps {
  //
  // get * one-time * user coordination via geolocator
  //
  Future<Position> currentPosition = Geolocator().getCurrentPosition(
      desiredAccuracy: LocationAccuracy.bestForNavigation,
      locationPermissionLevel: GeolocationPermission.locationWhenInUse);
}
        return snapshot.hasData
            ? ProviderApp(snapshot.data.latitude)
            : Center(child: CircularProgressIndicator());