флаттер как попунтил на динамическую страницу? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть страница поста, которая выдвинута с родительской страницы.И на этой странице есть 3 шага, которые требуют еще 2 нажатий (каждая страница использует CupertinoPageRoute для нажатия).После ввода всего текстового поля, ему нужно всплыть до стартовой страницы (всплывают 3 страницы за раз), которая является динамической страницей с topic_id.

Homepage
 ┗ TopicPage (specified with topic_id) 
    ┗ CreatePage (input some text)
       ┗ OptionPage (select some options to finish creation)

Затем завершите создание и вернитесь к TopicPage с тем жеtopic_id.

Как добиться этого эффекта?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вот фрагмент, который поможет вам добраться до любого предыдущего маршрута в дереве маршрутов.

          Navigator.popUntil(context, (Route<dynamic> route){
            bool shouldPop = false;
            if(route.settings.name == HomePage.routeName){
              shouldPop = true;
            }
            return shouldPop;
          });

Если вам нужен полный образец для этого кода, пожалуйста, найдите прилагаемую демонстрацию.

import 'package:flutter/material.dart';

void main(){



  runApp(MaterialApp(
    title: "Demo App",
    routes: {
      HomePage.routeName : (_) => HomePage(),
      Step1Page.routeName : (_) => Step1Page(),
      Step2Page.routeName : (_) => Step2Page(),
      Step3Page.routeName : (_) => Step3Page(),
    },
    home: SplashPage(),
    initialRoute: HomePage.routeName,
  ));
}

class SplashPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold();
  }
}


class HomePage extends StatelessWidget {

  static const routeName = "/home";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Home Page"),
            RaisedButton(onPressed: (){
              Navigator.pushNamed(context, Step1Page.routeName);
            }, child: Text("Start Steps"),)
          ],
        ),
      ),
    );
  }
}


class Step1Page extends StatelessWidget {

  static const routeName = "/step1";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Step1 Page"),
            RaisedButton(onPressed: (){
              Navigator.pushNamed(context, Step2Page.routeName);
            }, child: Text("Go Step2"),)
          ],
        ),
      ),
    );
  }
}



class Step2Page extends StatelessWidget {

  static const routeName = "/step2";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Step2 Page"),
            RaisedButton(onPressed: (){
              Navigator.pushNamed(context, Step3Page.routeName);
            }, child: Text("Go Step3"),)
          ],
        ),
      ),
    );
  }
}

class Step3Page extends StatelessWidget {

  static const routeName = "/step3";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Step3 Page"),
            RaisedButton(onPressed: (){
              Navigator.popUntil(context, (Route<dynamic> route){
                bool shouldPop = false;
                if(route.settings.name == HomePage.routeName){
                  shouldPop = true;
                }
                return shouldPop;
              });
            }, child: Text("Go Home"),)
          ],
        ),
      ),
    );
  }
}

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 30 ноября 2018

Насколько я понимаю, вы хотите вернуться к определенному маршруту.Например, чтобы вернуться к маршруту с именем «логин», вы можете сделать следующее:

Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
...