Отдельные шаги в stepper в разные файлы

#flutter #dart

#flutter #dart

Вопрос:

Я стараюсь, чтобы каждый шаг был в другом dart файле. (Steps содержит много кода, его сложно сохранить в одном файле)

В чем идея?

  1. Создать Scaffold с stepper помощью (родительского виджета)
  2. Родительский виджет создает экземпляр шагов, каждый экземпляр изменяет одну и ту же модель (объект класса)
  3. Родительский виджет может вызывать 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) , до шага, и вызывает его из шага в соответствии с вашей бизнес-логикой.