import 'package:anyway/structs/trip.dart'; import 'package:flutter/material.dart'; class Greeter extends StatefulWidget { final Trip trip; Greeter({ required this.trip, }); @override State createState() => _GreeterState(); } class _GreeterState extends State { Widget greeterBuilder (BuildContext context, Widget? child) { ThemeData theme = Theme.of(context); Widget topGreeter; if (widget.trip.landmarks.length > 1) { topGreeter = FutureBuilder( future: widget.trip.cityName, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Text( 'Welcome to ${snapshot.data}!', style: TextStyle(color: theme.primaryColor, fontWeight: FontWeight.bold, fontSize: 24), ); } else if (snapshot.hasError) { return const Text('Welcome to your trip!'); } else { return const Text('Welcome to ...'); } } ); } else { // still awaiting the trip // We can hopefully infer the city name from the cityName future // Show a linear loader at the bottom and an info message above topGreeter = Column( mainAxisAlignment: MainAxisAlignment.end, children: [ FutureBuilder( future: widget.trip.cityName, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Text( 'Generating your trip to ${snapshot.data}...', style: TextStyle(color: theme.primaryColor, fontWeight: FontWeight.bold, fontSize: 24), ); } else if (snapshot.hasError) { return const Text('Error while fetching city name'); } return const Text('Generating your trip...'); } ), Padding( padding: EdgeInsets.all(5), child: const LinearProgressIndicator() ) ] ); } return Center( child: Column( children: [ // Padding(padding: EdgeInsets.only(top: 20)), topGreeter, Padding( padding: EdgeInsets.all(20), child: bottomGreeter ), ], ) ); } Widget bottomGreeter = const Text( "Busy day ahead? Here is how to make the most of it!", style: TextStyle(color: Colors.black, fontSize: 18), textAlign: TextAlign.center, ); @override Widget build(BuildContext context) { return ListenableBuilder( listenable: widget.trip, builder: greeterBuilder, ); } }