12. O roteamento do aprendizado do Flutter é o salto de página no Android

Roteamento em Flutter

De modo geral, o roteamento no Flutter é um salto de página, e a navegação de roteamento é gerenciada por meio do componente Navigator no Flutter. E fornece um método para gerenciar a pilha, como: Navigator.pushe Navigator.pop
Flutter fornece duas maneiras de configurar saltos de roteamento: 1. Roteamento básico 2. Roteamento nomeado

O uso de roteamento básico no Flutter

Por exemplo, precisamos bottonpular para a página depois de clicar

RaisedButton(
      onPressed: (){
        Navigator.of(context).push(
          MaterialPageRoute(
            builder:(context){
              return SearchPage();//返回需要启动的页面
            }
          )
        );
      },
    ),

Se precisarmos sair da página atual

 //悬浮button
      floatingActionButton: FloatingActionButton(
        child: Text('返回'),
        onPressed: (){
          Navigator.of(context).pop();	//退出当前页面
        },
      ),

Use Navigatora página para passar o valor


class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        RaisedButton(
          child: Text('跳转到搜索页面'),
          onPressed: () {
            Navigator.of(context).push(MaterialPageRoute(
              builder: (context) => SeachPage(),
            ));
          },
          color: Theme.of(context).accentColor,
          textTheme: ButtonTextTheme.primary,
        ),
        SizedBox(
          height: 10,
        ),
        RaisedButton(
          child: Text('跳转至表单页面,并传值'),
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context)=>FromPage(title: '这是传递的title')		//因为此处向构造参数值传递,也可以通过get set去传递值
              )
            );
          },
          color: Theme.of(context).accentColor,
          textTheme: ButtonTextTheme.primary,
        )
      ],
    );
  }
}



class FromPage extends StatelessWidget{
  String title;


  FromPage({this.title='默认From'});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(this.title),  //在此处,将传递的数据进行引用
      ),
      body: ListView(
        children: <Widget>[
          ListTile(
            title: Text('我是表单'),
          ),
          ListTile(
            title: Text('我是表单'),
          ),
          ListTile(
            title: Text('我是表单'),
          ),
          ListTile(
            title: Text('我是表单'),
          ),
          ListTile(
            title: Text('我是表单'),
          ),
          ListTile(
            title: Text('我是表单'),
          ),

        ],
      ),
    );
  }



}

insira a descrição da imagem aqui

Uso de rotas nomeadas no Flutter

Ao navegar com rotas nomeadas, precisamos primeiro declarar as rotas. Ou seja, queremos configurar o roteamento MaterialAppemroutes

Vale ressaltar que o valor das rotas é Map<String, WidgetBuilder>do tipo

main()=>runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Tabs(),
      routes: {
        '/form':(context)=>FromPage(),//表单页面
        '/Seach':(context)=>SeachPage(),//搜索页面
      },
    );
  }
}

Ao saltar, só precisamos realizar tais operações

 RaisedButton(
          child: Text('跳转到搜索页面'),
          onPressed: () {
            Navigator.pushNamed(context, '/Seach');//这里的第二个参数就是我们的routes的Map集合中的key即可。
          },
          color: Theme.of(context).accentColor,
          textTheme: ButtonTextTheme.primary,
        ),

Passagem por valor para rotas nomeadas

Primeiro de tudo, precisamos criar o nosso Roustes.dartpara gerenciamento de roteamento

final  routes={
  '/':(context)=>Tabs(),
  '/search':(context,{arguments})=>SeachPage(arguments:arguments),
  "/from":(context)=>FromPage(),
};

//固定写法
var onGenerateRoute=(RouteSettings settings) {
  // 统一处理
  final String name = settings.name;
  final Function pageContentBuilder = routes[name];
  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      final Route route = MaterialPageRoute(
          builder: (context) =>
              pageContentBuilder(context, arguments: settings.arguments));
      return route;
    }else{
      final Route route = MaterialPageRoute(
          builder: (context) =>
              pageContentBuilder(context));
      return route;
    }
  }
};

onGenerateRouteEsta é uma forma fixa de escrever parâmetros para rotas nomeadas. Ao passar parâmetros em rotas nomeadas, nossos parâmetros de construção de página precisam ser alterados.

MaterialAppExiste um atributo em onGenerateRoute, que é o que definimos onGenerateRoutee passamos.

main()=>runApp(MyApp());
class MyApp extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
//      home: Tabs(),等同于 initialRoute: '/',
      initialRoute: './',
      onGenerateRoute: onGenerateRoute,
    );
  }
}

Por exemplo, nossa SeachPagepágina precisa adicionar um parâmetro opcional de 'argumentos'


class SeachPage extends StatelessWidget{

  final arguments;


  SeachPage({this.arguments});
}

Então, como devemos passar parâmetros? Suponha que passamos parâmetros para a página
em nossa página ,HomePageSeachPage


class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        RaisedButton(
          child: Text('跳转到搜索页面'),
          onPressed: () {	//此处进行参数传递,arguments
              Navigator.pushNamed("/search",arguments: {
                "id":"213123"
              });
          },
          color: Theme.of(context).accentColor,
          textTheme: ButtonTextTheme.primary,
        ),
        SizedBox(
          height: 10,
        ),
        RaisedButton(
          child: Text('跳转至表单页面,并传值'),
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context)=>FromPage(title: '这是传递的title',)
              )
            );
          },
          color: Theme.of(context).accentColor,
          textTheme: ButtonTextTheme.primary,
        )
      ],
    );
  }
}

SeachPageLidar com parâmetros na página

class SeachPage extends StatelessWidget{

  final arguments;


  SeachPage({this.arguments});

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      //悬浮button
      floatingActionButton: FloatingActionButton(
        child: Text('返回'),
        onPressed: (){
          Navigator.of(context).pop();
        },
      ),
      appBar: AppBar(
        title: Text('搜索'),
      ),
      body: Text("搜索页面区域${arguments['id']}")//进行参数的使用
    );
  }
}

Acho que você gosta

Origin blog.csdn.net/weixin_44710164/article/details/104584545
Recomendado
Clasificación