(十)Flutter 路由 push pop 与List 中溅墨(我咋觉得应该叫水波纹)效果(InkWell)

修改Main.dart

import 'package:flutter/material.dart';
import 'demo/navigator_demo.dart';
import 'demo/page_demo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: NavigatorDemo(),
      routes: {
        '/about': (context) => PageDemo(title: 'About'),
        '/home': (context) => PageDemo(title: 'Home'),
      },
      theme: ThemeData(
          primarySwatch: Colors.yellow,
          highlightColor: Color.fromRGBO(255, 255, 255, 0.5),
          splashColor: Colors.white70),
    );
  }
}

 

navigator_demo.dart

import 'package:flutter/material.dart';
import 'package:flutter_app/demo/page_demo.dart';
class NavigatorDemo extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              child: Text('Home'),
              onPressed: (){
                Navigator.pushNamed(context, '/home');
              },
            ),
            FlatButton(
              child: Text('About'),
              onPressed: (){
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (BuildContext context) {
                      return PageDemo(title:"About");
                    }

                    )
                );
              },
            )
          ],

        ),
      ),
    );
  }
}

【page_demo.dart】

import 'package:flutter/material.dart';

class PageDemo extends StatelessWidget {
  final String title;
  PageDemo({
    this.title
  });
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
        elevation: 0.0,
      ),
      floatingActionButton: FlatButton(
        child: Icon(Icons.arrow_back),
        onPressed: (){
          Navigator.pop(context);
        },
      ),
    );
  }
}

 

Push 和pop 是进入和退出页面 也可以主动调用,除了这种方式写路由还有一种是使用initialRoute

方式如下

修改main.dart

import 'package:flutter/material.dart';
import 'demo/navigator_demo.dart';
import 'demo/page_demo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      // home: NavigatorDemo(),
      initialRoute: "/",
      routes: {
        '/': (context) => NavigatorDemo(),
        '/about': (context) => PageDemo(title: 'About'),
        '/home': (context) => PageDemo(title: 'Home'),
      },
      theme: ThemeData(
          primarySwatch: Colors.yellow,
          highlightColor: Color.fromRGBO(255, 255, 255, 0.5),
          splashColor: Colors.white70),
    );
  }
}

 效果同上 就不多贴图

    '/':(context)=>NavigatorDemo(),

表示初始路由对应的文件。

   initialRoute: '/',

初始路由,代表根路由对应的路径

也就是说 如果initiaRoute 换成初始值/about

      initialRoute: '/about',
      routes: {
        '/':(context)=>NavigatorDemo(),
        '/about':(context)=>PageDemo(title: 'About'),
        '/home':(context)=>PageDemo(title: 'Home'),
      },

那么 刚进入主页就会先显示about页面(不贴图了。。)

so 我们根据这一特性就会知道。这么写可以直接路由到主页

import 'package:flutter/material.dart';
import 'package:flutter_app/home/home.dart';
import 'demo/navigator_demo.dart';
import 'demo/page_demo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      // home: NavigatorDemo(),
      initialRoute: '/',
      routes: {
        '/':(context)=>Home(),
      },
      theme: ThemeData(
          primarySwatch: Colors.yellow,
          highlightColor: Color.fromRGBO(255, 255, 255, 0.5),
          splashColor: Colors.white70),
    );
  }
}

之前我们写过一个listviewdemo 我们这次加上一个水波纹特效(溅墨)

listview_demo.dart

precode

import 'package:flutter/material.dart';
import 'package:flutter_app/model/post.dart';

class ListViewDemo extends StatelessWidget {
  Widget _listItemBuilder(BuildContext context, int index) {
    return Container(
      color: Colors.white,
      margin: EdgeInsets.all(8.0),
      child: Column(
        children: <Widget>[
          Image.network(posts[index].imgeUrl),
          SizedBox(height: 16.0),
          Text(
            posts[index].title,
            style: Theme.of(context).textTheme.headline6,
          ),
          Text(
            posts[index].author,
            style: Theme.of(context).textTheme.subtitle1,
          ),
          SizedBox(height: 16.0),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {

    return ListView.builder(
      itemCount: posts.length,
      itemBuilder: _listItemBuilder,
    );
  }
}

 

修改图片 使用 

AspectRatio

布局包裹 

Stack

并新增

       Positioned.fill(
            child: Material(
              color: Colors.transparent,
              child: InkWell(
                splashColor: Colors.white.withOpacity(0.3),
                highlightColor: Colors.white.withOpacity(0.1),
                onTap: () {
                  debugPrint("tap");
                },
              ),
            ),
          )

改变后代码

import 'package:flutter/material.dart';
import 'package:nihao_flutter/model/post.dart';

class ListViewDemo extends StatelessWidget {
  Widget _listItemBuilder(BuildContext context, int index) {
    return Container(
        color: Colors.white,
        margin: EdgeInsets.all(8.0),
        child: Stack(
          children: <Widget>[
            Column(
              children: <Widget>[
               AspectRatio(
                 aspectRatio: 16/9,
                 child:  Image.network(posts[index].imgeUrl,fit: BoxFit.cover),
               ),
                SizedBox(height: 16.0),
                Text(
                  posts[index].title,
                  style: Theme.of(context).textTheme.title,
                ),
                Text(
                  posts[index].author,
                  style: Theme.of(context).textTheme.subhead,
                ),
                SizedBox(height: 16.0),
              ],
            ),
            Positioned.fill(
              child: Material(
                color: Colors.transparent,
                child: InkWell(
                  splashColor: Colors.white.withOpacity(0.3),
                    highlightColor: Colors.white.withOpacity(0.1),
                    onTap: (){
                      debugPrint('Tap');
                    },
                ),
              ),
            )
          ],
        ));
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ListView.builder(
      itemCount: posts.length,
      itemBuilder: _listItemBuilder,
    );
  }
}

效果

 

最后温习一下push ListView和详情页的交互

新建 post_show.dart 详情页面

import 'package:flutter/material.dart';
import '../model/post.dart';

class PostShow extends StatelessWidget {
  final Post post;
  PostShow({
    @required this.post,
  });
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('${post.title}'),
        elevation: 0.0,
      ),
      body: Column(
        children: <Widget>[
          Image.network(post.imgeUrl),
          Container(
            padding: EdgeInsets.all(32.0),
            width: double.infinity,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text(
                  '${post.title}',
                  style: Theme.of(context).textTheme.title,
                ),
                Text(
                  '${post.author}',
                  style: Theme.of(context).textTheme.subhead,
                ),
                SizedBox(height: 32.0,),
                Text(
                  '${post.description}',
                  style: Theme.of(context).textTheme.body1,
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

之前的post.dart 加上description属性

class Post {
  const Post({
    this.title,
    this.author,
    this.imgeUrl,
    this.description,
  });

  final String title;
  final String author;
  final String imgeUrl;
  final String description;
}

final List<Post> posts = [
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
    description: '1',
  ),
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
    description: '2',
  ),
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
    description: '3',
  ),
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
    description: '4',
  ),
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
  ),
  Post(
    title: '七叶森',
    author: 'Liu An',
    imgeUrl:
        'https://www.baidu.com/img/bd_logo1.png?where=super',
    description: '5',
  )
];

listview_demo.dart持续修改Inwell的ontap节点

               onTap: (){
                      Navigator.of(context).push(
                        MaterialPageRoute(builder: (BuildContext context) {
                          return PostShow(post:posts[index]);
                        })
                      );
                    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值