#flutter #dart
#flutter #dart
Вопрос:
Я стараюсь, чтобы каждый шаг был в другом dart
файле. (Steps содержит много кода, его сложно сохранить в одном файле)
В чем идея?
- Создать
Scaffold
сstepper
помощью (родительского виджета) - Родительский виджет создает экземпляр шагов, каждый экземпляр изменяет одну и ту же модель (объект класса)
- Родительский виджет может вызывать
isValid()
метод на каждом шаге. (если это допустимо, мы можем перейти к следующему шагу)
Требования:
- Шаги могут быть
StatefulWidget
илиStatelessWidget
(это может быть трудно достичь, поэтому StatefulWidget будет достаточно) - Каждый шаг должен содержать
bool isValid()
метод.
Что у меня есть? — Почти ничего
abstract class ValidatedStep {
bool isValid();
}
И смотрите Ниже Step
, мы реализуем это abstract class
в Step1
, но этот метод должен спросить state
, действителен ли он. У StatefulWidget
нас нет доступа к состоянию.
class Step1 extends StatefulWidget implements ValidatedStep {
//its ok to create it here?
final _Step1State state = _Step1State();
@override
_Step1State createState() {
//we could (and should?) create state here, but variables in this widget should be final
return state;
}
@override
bool isValid() {
return state.isValid();
}
}
class _Step1State extends State<Step1> implements ValidatedStep {
@override
Widget build(BuildContext context) {
return Container();
}
@override
bool isValid() {
return true;
}
}
Ответ №1:
Вы можете использовать map.. Вот измененный пример моего кода .. Возможно, вы можете изменить, чтобы добавить функцию для проверки шагов.
Вы можете просто поместить разные виджеты из разных файлов в список.
class StepperScreen extends StatelessWidget {
final List<SomeClass> list;
StepperScreen({@required this.list});
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text(
'Stepper Screen',
),
),
body: Stepper(
steps: getStep(list),
),
),
);
}
}
List<Step> getStep(List<SomeClass> list) {
return list
.map(
(e) => Step(
title: Text(
e.name,
style: TextStyle(fontSize: 20),
),
content: e.child,
),
)
.toList();
}
Конечно, ваш SomeClass должен иметь свойства:
class SomeClass {
String name;
Widget child;
SomeClass({@required this.name, @required this.child});
}
Комментарии:
1. Как задать этот виджет с полным состоянием, если он действителен? 🙂
2. что вы хотите проверить на проверку?
3. я понятия не имею, что вы хотите сделать с isValid(). Но, если вы хотите заполнить только экран определенными свойствами, возможно, вы можете сначала отфильтровать исходный список, а затем заполнить на основе нового списка. Если вы хотите, чтобы все дочерние виджеты имели доступ к методу isvalid(), возможно, вы можете использовать для этого провайдеров.
4. От родителя я мог бы вызвать
bool isValid()
дочерние шаги, а затем я узнаю, что форма или что-то другое в порядке5. Я отредактировал ответ, пожалуйста, проверьте код
Step1
Ответ №2:
Немного поздно для вечеринки, но вместо того, чтобы задавать шаг isValid()
, передает ли он какой-либо обратный вызов, например onReadyChange(bool)
, до шага, и вызывает его из шага в соответствии с вашей бизнес-логикой.