Assemblare la schermata con PageView e indicatore
Ora creiamo OnboardingScreen, uno StatefulWidget che usa un PageController e un PageView.builder per scorrere le pagine.
Aggiungiamo SmoothPageIndicator per mostrare la posizione corrente con un'animazione ed espandiamo un pulsante che cambia testo sull'ultima pagina.
import 'package:flutter/material.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
class OnboardingScreen extends StatefulWidget {
final VoidCallback onFinish;
const OnboardingScreen({super.key, required this.onFinish});
@override
State<OnboardingScreen> createState() => _OnboardingScreenState();
}
class _OnboardingScreenState extends State<OnboardingScreen> {
final _controller = PageController();
int _currentPage = 0;
bool get _isLastPage => _currentPage == onboardingPages.length - 1;
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _next() {
if (_isLastPage) {
widget.onFinish();
} else {
_controller.nextPage(
duration: const Duration(milliseconds: 350),
curve: Curves.easeInOut,
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
Align(
alignment: Alignment.topRight,
child: TextButton(
onPressed: widget.onFinish,
child: const Text('Salta'),
),
),
Expanded(
child: PageView.builder(
controller: _controller,
itemCount: onboardingPages.length,
onPageChanged: (i) => setState(() => _currentPage = i),
itemBuilder: (_, i) => OnboardingPage(data: onboardingPages[i]),
),
),
SmoothPageIndicator(
controller: _controller,
count: onboardingPages.length,
effect: const ExpandingDotsEffect(
dotHeight: 10,
dotWidth: 10,
),
),
Padding(
padding: const EdgeInsets.all(24),
child: SizedBox(
width: double.infinity,
child: FilledButton(
onPressed: _next,
child: Text(_isLastPage ? 'Inizia' : 'Avanti'),
),
),
),
],
),
),
);
}
}
Risultato atteso
Puoi scorrere le pagine, l'indicatore si anima e il pulsante mostra 'Inizia' sull'ultima pagina.