Как настроить поведение прокрутки страницы для первой страницы многостраничного PageView? - PullRequest
0 голосов
/ 05 мая 2020

Я использую PageView.builder для управления набором из 5 страниц. Виджет PageView позволяет пользователю проводить пальцем влево / вправо для перехода между страницами. Я также могу использовать PageController для программного перехода к разным страницам, например, при нажатии кнопки. Это все желаемое поведение. С учетом сказанного, на первой странице у меня есть форма, которую я хотел бы проверить, прежде чем позволить пользователю продолжить. С помощью кнопки я могу просто вызвать метод проверки формы для проверки перед уходом, например:

          onPressed: () {
            if (_formKey.currentState.validate()) {
              //Navigate to next page...
              _pageController.nextPage(duration: Duration(milliseconds: 300), curve: Curves.linear);
            }
          },

Мой вопрос: как я могу выполнить эту проверку, прежде чем позволить пользователю перемещаться с помощью жеста смахивания ?

Спасибо

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете изменить физику PageView:

GlobalKey<FormState> _formKey = GlobalKey<FormState>();
StreamController isValidController = StreamController();
bool isValid = false;

List pages;

@override
void initState() {
  super.initState();

  isValidController.stream.listen((value){
    setState(() {
      isValid = value;
    });
  });

  pages = [
    FormPage(isValidController: isValidController, formKey: _formKey,),
    SecondPage(),
    ThirdPage(),
    FourthPage(),
    FifthPage(),
  ];
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: PageView.builder(
      physics: isValid ? ClampingScrollPhysics() : NeverScrollableScrollPhysics(), //changing here
      itemBuilder: (_, index) {
        return pages[index];
      },
    ),
  );
}

@override
void dispose() {
  isValidController.close();
  super.dispose();
}

И на странице с формой:

class FormPage extends StatelessWidget {

  final GlobalKey<FormState> formKey;
  final StreamController isValidController;

  const FormPage({Key key, this.formKey, this.isValidController});

  @override
  Widget build(BuildContext context) {
    return Form(
      key: formKey,
      child: Align(
        child: RaisedButton(
          onPressed: () {
            if (formKey.currentState.validate()) {
                isValidController.add(true);
            }
          },
        ),
      ),
    );
  }
}
...