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());