verbindings_banner.dart.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Automatic FlutterFlow imports
  2. import '/backend/schema/structs/index.dart';
  3. import '/flutter_flow/flutter_flow_theme.dart';
  4. import '/flutter_flow/flutter_flow_util.dart';
  5. import 'index.dart'; // Imports other custom widgets
  6. import '/custom_code/actions/index.dart'; // Imports custom actions
  7. import '/flutter_flow/custom_functions.dart'; // Imports custom functions
  8. import 'package:flutter/material.dart';
  9. // Begin custom widget code
  10. // DO NOT REMOVE OR MODIFY THE CODE ABOVE!
  11. import 'package:go_router/go_router.dart';
  12. /// Balkje dat zichzelf toont zodra de server onbereikbaar is.
  13. ///
  14. /// Waarom een custom widget en geen Text met een Visibility-conditie: de
  15. /// widgets in dit project lezen App State via de singleton `FFAppState()`,
  16. /// niet via `context.watch`. Een gewone conditie zou dus pas opnieuw
  17. /// evalueren als er toevallig iets anders een rebuild veroorzaakt. Dit
  18. /// widget luistert zelf naar FFAppState en verschijnt daardoor direct.
  19. class VerbindingsBanner extends StatefulWidget {
  20. const VerbindingsBanner({
  21. super.key,
  22. this.width,
  23. this.height,
  24. this.tekst,
  25. });
  26. final double? width;
  27. final double? height;
  28. final String? tekst;
  29. @override
  30. State<VerbindingsBanner> createState() => _VerbindingsBannerState();
  31. }
  32. class _VerbindingsBannerState extends State<VerbindingsBanner> {
  33. // Gedeeld over alle instanties: bij het doorklikken tussen pagina's wordt
  34. // niet bij elke opbouw opnieuw een verzoek gedaan.
  35. static DateTime? _laatsteCheck;
  36. static const Duration _minimaalTussenChecks = Duration(seconds: 20);
  37. bool _bezig = false;
  38. @override
  39. void initState() {
  40. super.initState();
  41. WidgetsBinding.instance.addPostFrameCallback((_) => _checkIndienNodig());
  42. }
  43. Future<void> _checkIndienNodig() async {
  44. final vorige = _laatsteCheck;
  45. if (vorige != null &&
  46. DateTime.now().difference(vorige) < _minimaalTussenChecks) {
  47. return;
  48. }
  49. await _check(herlaadBijHerstel: false);
  50. }
  51. /// [herlaadBijHerstel] staat alleen aan bij een tik van de gebruiker.
  52. /// Automatisch herladen zou een lus opleveren: de pagina bouwt het widget
  53. /// opnieuw op, dat checkt weer, enzovoort.
  54. Future<void> _check({bool herlaadBijHerstel = true}) async {
  55. if (_bezig) return;
  56. if (mounted) setState(() => _bezig = true);
  57. _laatsteCheck = DateTime.now();
  58. bool bereikbaar = false;
  59. try {
  60. bereikbaar = await checkVerbinding();
  61. } finally {
  62. if (mounted) setState(() => _bezig = false);
  63. }
  64. if (bereikbaar && herlaadBijHerstel && mounted) {
  65. // De FutureBuilders op deze pagina zijn al klaar met een mislukte
  66. // respons; alleen de balk weghalen laat een leeg scherm achter.
  67. // Daarom de huidige route opnieuw opbouwen, zodat de data alsnog laadt.
  68. final huidigePad = GoRouterState.of(context).uri.toString();
  69. context.pushReplacement(huidigePad);
  70. }
  71. }
  72. @override
  73. Widget build(BuildContext context) {
  74. return AnimatedBuilder(
  75. animation: FFAppState(),
  76. builder: (context, _) {
  77. if (!FFAppState().geenVerbinding) {
  78. // Neemt geen ruimte in zolang alles in orde is.
  79. return const SizedBox.shrink();
  80. }
  81. return Material(
  82. color: Colors.transparent,
  83. child: InkWell(
  84. onTap: () => _check(),
  85. child: Container(
  86. width: widget.width ?? double.infinity,
  87. height: widget.height,
  88. color: FlutterFlowTheme.of(context).primary,
  89. padding:
  90. const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
  91. child: Row(
  92. mainAxisSize: MainAxisSize.max,
  93. children: [
  94. const Icon(Icons.cloud_off, color: Colors.white, size: 18.0),
  95. const SizedBox(width: 8.0),
  96. Expanded(
  97. child: Text(
  98. widget.tekst ??
  99. 'Geen verbinding — tik om het opnieuw te proberen',
  100. style: const TextStyle(
  101. color: Colors.white,
  102. fontSize: 13.0,
  103. ),
  104. ),
  105. ),
  106. if (_bezig)
  107. const SizedBox(
  108. width: 14.0,
  109. height: 14.0,
  110. child: CircularProgressIndicator(
  111. strokeWidth: 2.0,
  112. color: Colors.white,
  113. ),
  114. ),
  115. ],
  116. ),
  117. ),
  118. ),
  119. );
  120. },
  121. );
  122. }
  123. }