我有一个工作的“TestScreen”小部件,它可以获取并显示用户的位置坐标。当_isLoading为true时,它显示了一个加载轮,并且该状态变量在此StatefulWidget中声明的函数内控制。
class TestScreen extends StatefulWidget {
@override
_TestScreenState createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> {
bool _isLocationPermissionGranted = false;
Position _currentPosition = const Position(
latitude: 0,
longitude: 0,
accuracy: 0,
altitude: 0,
heading: 0,
speed: 0,
speedAccuracy: 0,
timestamp: null);
bool _isLoading = false;
Future<void> _checkLocationPermission() async {
setState(() {
_isLoading = true;
});
final LocationPermission permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
setState(() {
_isLocationPermissionGranted = false;
_isLoading = false;
});
} else if (permission == LocationPermission.always ||
permission == LocationPermission.whileInUse) {
setState(() {
_isLocationPermissionGranted = true;
});
await _getCurrentLocation();
setState(() {
_isLoading = false;
});
}
}
Future<void> _getCurrentLocation() async {
setState(() {
_isLoading = true;
});
try {
final Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
setState(() {
_currentPosition = position;
_isLoading = false;
});
} catch (e) {
print("Error getting location: $e");
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Location Tracking'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
_isLocationPermissionGranted
? 'Location Permission Granted'
: 'Location Permission Denied',
),
SizedBox(height: 20),
Text('Latitude: ${_currentPosition.latitude}'),
Text('Longitude: ${_currentPosition.longitude}'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isLoading ? null : _checkLocationPermission,
child: Text('Request Location Permission'),
),
_isLoading
? Padding(
padding: EdgeInsets.all(20.0),
child: CircularProgressIndicator(),
)
: SizedBox(),
],
),
),
);
}
}
现在这工作得很好,但是我想把与位置相关的变量和函数放在一个单独的LocationService类中。然而,我不能再使用setState简单地更新_isLoading bool了。
TLDR:什么是重构此代码的行业标准方法,以便我可以为与LocationService相关的所有内容提供单独的类文件,并且仍然控制TestScreen小部件中的isLoading变量?
1条答案
按热度按时间a6b3iqyw1#
我尽了最大的努力来编写最小的代码。我认为最好将UI和服务分开。现在,它看起来更干净,更漂亮。
您可能会注意到,我为您在服务中编写了额外的几行代码。在checkLocationPermission()中,我尝试处理所有可能的结果。在getCurrentLocation()中,我试图增强和调整。
在UI的一部分,你可以看到我是如何管理加载的。我自己改进代码。现在,它完美地工作。
main.dart
location_service.dart