我正在构建一个用于学习的天气应用程序,在应用程序开始时,我想获取用户的位置。初始屏幕是无状态小部件,不执行任何操作。当位置可用时,我想推送到另一个屏幕。
我能够做到,但这是正确的方法(请查看下面的代码(? 让我知道任何其他解决方案。
在从构建方法返回小部件之前,我调用getLocation
方法。这是理想的做法吗?因为此屏幕状态不会更新。
class LaunchScreen extends StatelessWidget {
static const String id = 'launch_screen';
void getLocation(BuildContext context) async {
LocationData location = await LocationService().getCurrentLocation();
if (location != null) {
// Go to home
print(location.latitude);
print(location.longitude);
} else {
// Error fetching location
}
}
@override
Widget build(BuildContext context) {
getLocation(context);
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: Container(),
),
Center(
child: Image(
image: AssetImage('images/launch_screen/app_logo.png'),
),
),
SizedBox(
height: 8,
),
Center(
child: Shimmer.fromColors(
baseColor: Colors.white.withOpacity(0.6),
highlightColor: Colors.white,
child: Text(
'Forecasts',
style: GoogleFonts.montserratAlternates(
textStyle:
TextStyle(fontSize: 60, fontWeight: FontWeight.w300),
color: Colors.white.withOpacity(0.6)),
),
),
),
Expanded(
child: Container(),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Made with ❤️ ',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w300,
color: Colors.white.withOpacity(0.5)),
),
Text(
'Parth Adroja',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: Colors.white.withOpacity(0.5)),
),
],
),
SizedBox(
height: 20,
)
],
),
);
}
}
您可以使用FutureBuilder
来执行此操作。
喜欢:
Widget build(BuildContext context) {
return FutureBuilder(
initialData: null,
future: getLocation(),
builder: (context, snap){
if(snap.hasData){
return FullDataWidget(snap.data);
}else{
return SplashScreen();
}
},
);
}