Вопрос или проблема
Предположим, у меня есть 5 шагов в степпере, поэтому каждый шаг и его содержимое должны быть на одной странице.
На этом изображении мы можем видеть шаги на одной странице. Я хочу отобразить заголовок одного шага на отдельной странице.
Другие функции останутся такими же, как: пользователь может изменять свои значения между экранами перед окончательной отправкой, а на последней странице я получу значения всех элементов управления формой.
Я нашел пакет form_page_view, он неплох, но не предоставляет функции, которые я ожидаю.
Заранее спасибо 😀
Я новичок в Flutter!!
Ответ или решение
Чтобы настроить Stepper в Flutter таким образом, чтобы каждый шаг отображался на отдельной странице, можно использовать комбинацию PageView
и Stepper
. В этом ответе я продемонстрирую, как это реализовать, чтобы у вас был один шаг на странице, и пользователь мог возвращаться к предыдущим шагам для изменения введенных данных.
Вот пример кода, который поможет вам создать такое приложение:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Stepper Example',
home: StepperPage(),
);
}
}
class StepperPage extends StatefulWidget {
@override
_StepperPageState createState() => _StepperPageState();
}
class _StepperPageState extends State<StepperPage> {
final int _totalSteps = 5;
int _currentStep = 0;
final PageController _pageController = PageController();
final List<TextEditingController> _controllers = List.generate(5, (_) => TextEditingController());
void _nextStep() {
if (_currentStep < _totalSteps - 1) {
setState(() {
_currentStep++;
_pageController.jumpToPage(_currentStep);
});
}
}
void _prevStep() {
if (_currentStep > 0) {
setState(() {
_currentStep--;
_pageController.jumpToPage(_currentStep);
});
}
}
void _submit() {
// Здесь вы можете обработать отправку данных
for (var controller in _controllers) {
print(controller.text);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Stepper with Pages'),
),
body: Column(
children: [
Expanded(
child: PageView.builder(
controller: _pageController,
onPageChanged: (index) {
setState(() {
_currentStep = index;
});
},
itemCount: _totalSteps,
itemBuilder: (context, index) {
return _buildStepContent(index);
},
),
),
_buildNavigationBar(),
],
),
);
}
Widget _buildStepContent(int stepIndex) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Шаг ${stepIndex + 1}',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 20),
TextField(
controller: _controllers[stepIndex],
decoration: InputDecoration(labelText: 'Введите данные для шага ${stepIndex + 1}'),
),
],
),
);
}
Widget _buildNavigationBar() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
onPressed: _currentStep == 0 ? null : _prevStep,
child: Text('Назад'),
),
ElevatedButton(
onPressed: _currentStep == _totalSteps - 1 ? _submit : _nextStep,
child: Text(_currentStep == _totalSteps - 1 ? 'Отправить' : 'Вперед'),
),
],
);
}
}
Объяснение кода
-
Создание приложения: В
main()
запускается приложение, которое показываетStepperPage
. -
Стейт и контроллеры: Внутри
_StepperPageState
хранится индекс текущего шага и контроллер дляPageView
, а также массив контроллеров для текстовых полей на каждом шаге. -
Навигация: Методы
_nextStep
,_prevStep
и_submit
управляют переходами между шагами и обработкой данных. -
Строение контента: В методе
_buildStepContent
создается текстовое поле для ввода данных на каждом шаге, где индекс шага передается в качестве параметра. -
Навигационная панель: В
_buildNavigationBar
создаются кнопки "Назад" и "Вперед". Кнопка "Вперед" меняет текст на "Отправить", если пользователь находится на последнем шаге.
Заключение
Этот код предоставляет полный функционал, который вы ищете. Пользователи могут перемещаться между шагами, изменять значения и в конечном итоге отправить все данные. Вы можете расширить этот код, добавляя валидацию и стилизацию в зависимости от ваших требований.