flutter學習--頁面跳轉

一般頁面導航和返回

RaisedButton按鈕組件

它有兩個最基本的屬性:

  • child:可以放入容器,圖標,文字。讓你構建多彩的按鈕。
  • onPressed:點擊事件的相應,一般會調用Navigator組件。

Navigator.push 和 Navigator.pop

  • Navigator.push:是跳轉到下一個頁面,它要接受兩個參數一個是上下文context,另一個是要跳轉的函數。

  • Navigator.pop:是返回到上一個頁面,使用時傳遞一個context(上下文)參數,使用時要注意的是,你必須是有上級頁面的,也就是說上級頁面使用了Navigator.push。
    demo:

import 'package:flutter/material.dart';

void main()=>runApp(MaterialApp(
  title: '導航演示1',
  home: FirstScreen(),
));

class FirstScreen extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("第一個頁面"),
      ),
      body:Center(
        child: RaisedButton(onPressed: (){
          Navigator.push(context, MaterialPageRoute(builder: (context)=>SecondScreen()));
        },
        child: Text("點擊跳轉"),)
      ),
    );
  }
}

class SecondScreen extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar:AppBar(title:Text('技術胖商品詳情頁')),
        body:Center(child:RaisedButton(
            child:RaisedButton(
              child:Text('返回'),
              onPressed: (){
                Navigator.pop(context);
              },
            )
        ))
    );
  }
}

在這裏插入圖片描述
點擊之後跳轉
在這裏插入圖片描述

導航參數的傳遞和接收

頁面跳轉的時候參數的傳遞和接受是常用功能。

聲明數據結構類

Dart中可以使用類來抽象一個數據,比如我們模仿一個商品信息,有商品標題和商品描述。我們定義了一個Product類,裏邊有兩個字符型變量,title和description。

  • title:是商品標題。
  • description: 商品詳情描述
    代碼如下:
class Product {
  final String title; //商品標題
  final String description;//商品描述
  Product(this.title,this.description);//構造方法
}

構建一個商品列表

作一個商品的列表,這裏我們採用動態的構造方法,在主方法裏傳遞一個商品列表(List)到自定義的Widget中。

先來看看主方法的編寫代碼:

void main() => runApp(
  MaterialApp(
    title: "跳轉傳參",
    home: ProductList(
      products:List.generate(20, (i)=>Product("商品$i","描述$i"))
    ),
  )
);

上面的代碼是主路口文件,主要是在home屬性中,我們使用了ProductList,這個自定義組件,而且時候會報錯,因爲我們缺少這個組件。這個組件我們傳遞了一個products參數,也就是商品的列表數據,這個數據是我們用List.generate生成的。並且這個生成的List原型就是我們剛開始定義的Product這個類(抽象數據)。

ProductList自定義組件的代碼:

class ProductList extends StatelessWidget {
  final List<Product> products;
  ProductList({Key key,@required this.products}):super(key:key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: ListView.builder(itemBuilder: (context,index){
        return ListTile(title: Text(products[index].title),onTap: (){
        });
      },
      itemCount: products.length,),
    );
  }
}

先接受了主方法傳遞過來的參數,接受後用ListView.builder方法,作了一個根據傳遞參數數據形成的動態列表。

導航參數的傳遞

使用Navigator組件,然後使用路由MaterialPageRoute傳遞參數,具體代碼如下。

Navigator.push(
  context, 
  MaterialPageRoute(
    builder:(context)=>new ProductDetail(product:products[index])
  )
);

這段代碼要寫在onTap相應事件當中

子頁面接受參數並顯示

class ProductDetail extends StatelessWidget {
  final Product product;
  ProductDetail({Key key ,@required this.product}):super(key:key);
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title:Text('${product.title}'),
      ),
      body:Center(child: Text('${product.description}'),)
    );
  }
}

完整代碼

import 'package:flutter/material.dart';

class Product {
  final String title; //商品標題
  final String description;//商品描述
  Product(this.title,this.description);//構造方法
}

void main() => runApp(
  MaterialApp(
    title: "跳轉傳參",
    home: ProductList(
      products:List.generate(20, (i)=>Product("商品$i","描述$i"))
    ),
  )
);

class ProductList extends StatelessWidget {
  final List<Product> products;
  ProductList({Key key,@required this.products}):super(key:key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("商品列表"),
      ),
      body: ListView.builder(itemBuilder: (context,index){
        return ListTile(title: Text(products[index].title),onTap: (){
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder:(context)=>new ProductDetail(product:products[index])
              )
          );
        });
      },
      itemCount: products.length,),
    );
  }
}

class ProductDetail extends StatelessWidget {

  final Product product;
  ProductDetail({Key key,@required this.product}):super(key:key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('${product.title}'),
      ),
      body: Center(
        child: Text('${product.description}'),
      ),
    );
  }
}

在這裏插入圖片描述
點擊跳轉
在這裏插入圖片描述

頁面跳轉並返回數據

異步請求和等待

Dart中的異步請求和等待和ES6中的方法很像,直接使用async…await就可以實現。比如下面作了一個找小姐姐的方法,然後進行跳轉,注意這時候是異步的。等待結果回來之後,我們再顯示出來內容。具體代碼如下:

 _navigateToXiaoJieJie(BuildContext context) async{ //async是啓用異步方法

    final result = await Navigator.push(//等待
      context, 
      MaterialPageRoute(builder: (context)=> XiaoJieJie())
      );
      
      Scaffold.of(context).showSnackBar(SnackBar(content:Text('$result')));
  }
}

SnackBar的使用

SnackBar是用戶操作後,顯示提示信息的一個控件,類似Tost,會自動隱藏。SnackBar是以Scaffold的showSnackBar方法來進行顯示的。

Scaffold.of(context).showSnackBar(SnackBar(content:Text('$result')));

返回數據的方式

 Navigator.pop(context,'xxxx');  //xxx就是返回的參數

Demo:

import 'package:flutter/material.dart';

void main(){
  runApp(MaterialApp(
      title:'頁面跳轉返回數據',
      home:FirstPage()
  ));
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar:AppBar(title:Text("找小姐姐要電話")),
        body:Center(
          child: RouteButton(),
        )
    );
  }
}

//跳轉的Button
class RouteButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed:(){
        _navigateToXiaoJieJie(context);
      },
      child: Text('去找小姐姐'),
    );
  }

  _navigateToXiaoJieJie(BuildContext context) async{ //async是啓用異步方法

    final result = await Navigator.push(//等待
        context,
        MaterialPageRoute(builder: (context)=> XiaoJieJie())
    );

    Scaffold.of(context).showSnackBar(SnackBar(content:Text('$result')));
  }
}

class XiaoJieJie extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
          title:Text('我是小姐姐')
      ),
      body:Center(
          child:Column(
            children: <Widget>[
              RaisedButton(
                child: Text('大長腿小姐姐'),
                onPressed: (){
                  Navigator.pop(context,'大長腿:1511008888');
                },
              ) ,
              RaisedButton(
                child: Text('小蠻腰小姐姐'),
                onPressed: (){
                  Navigator.pop(context,'大長腿:1511009999');
                },
              ) ,
            ],
          )
      ) ,
    );
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章