Remove the external comunes-flutter library dependency and replace all its components with local implementations: - Utility functions: Created lib/utils/widget_utils.dart with compactWidgets() and ellipse() functions, replacing the comunes-flutter helpers with modern Dart null-safety patterns (whereType instead of where(notNull)) - Secret loader: Inlined as lib/utils/secret_loader.dart for loading JSON config - Layout widgets: Replaced CenteredRow/CenteredColumn with standard Row/Column with MainAxisAlignment.center - Intro screens: Copied AppIntroPage and MaterialAppWithIntro locally in lib/widgets/ with cleaned-up deprecated code patterns - Button widget: Created lib/widgets/rounded_btn.dart for the RoundedBtn used in activeFires.dart Changes span 20 files: - 5 new utility/widget files created - Updated imports in 15 files - Removed path dependency from pubspec.yaml - All functionality preserved, build verified with flutter pub get Impact: - Removes external dependency, simplifying project structure - Modern Dart patterns (proper null-safety) - Better code clarity with explicit widget properties - Easier onboarding (no 'what is comunes-flutter?' questions)
70 lines
1.9 KiB
Dart
70 lines
1.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'colors.dart';
|
|
import 'generated/i18n.dart';
|
|
import 'utils/widget_utils.dart';
|
|
|
|
typedef SlideCallback = void Function(int distance);
|
|
|
|
class FireDistanceSlider extends StatefulWidget {
|
|
const FireDistanceSlider(
|
|
{super.key, required this.initialValue, required this.onSlide});
|
|
final int initialValue;
|
|
final SlideCallback onSlide;
|
|
|
|
@override
|
|
_FireDistanceSliderState createState() => _FireDistanceSliderState();
|
|
}
|
|
|
|
class _FireDistanceSliderState extends State<FireDistanceSlider> {
|
|
_FireDistanceSliderState();
|
|
late int _sliderValue;
|
|
late final SlideCallback onSlide;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_sliderValue = widget.initialValue;
|
|
onSlide = widget.onSlide;
|
|
}
|
|
|
|
Widget sizeText(int sliderValue) =>
|
|
Text(S.of(context).subscribeToValueAroundThisArea(sliderValue.toString()),
|
|
style: const TextStyle(color: Colors.black87));
|
|
|
|
Widget warningText(int sliderValue) => _sliderValue >= 50
|
|
? Text(S.of(context).warningThisIsAVeryLargeArea,
|
|
style: const TextStyle(color: fires900))
|
|
: const Text('');
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final Slider slider = Slider(
|
|
value: _sliderValue + 0.0,
|
|
activeColor: fires900,
|
|
inactiveColor: Colors.black45,
|
|
min: 1.0,
|
|
max: 100.0,
|
|
divisions: 99,
|
|
label: '$_sliderValue',
|
|
onChanged: (double value) {
|
|
_sliderValue = value.round();
|
|
onSlide(_sliderValue);
|
|
setState(() {});
|
|
},
|
|
);
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: compactWidgets(<Widget?>[
|
|
const SizedBox(height: 50.0),
|
|
Row(children: <Widget>[slider]),
|
|
// new SizedBox(height: 5.0),
|
|
Column(children: <Widget>[
|
|
sizeText(_sliderValue),
|
|
const SizedBox(height: 5.0),
|
|
warningText(_sliderValue)
|
|
])
|
|
]),
|
|
);
|
|
}
|
|
}
|