拨打电话的功能在app里也很常见,比如一般的外卖app都会有这个才做。其实Flutter本身是没给我们提供拨打电话的能力的,那我们如何来拨打电话那?

1、编写店长电话模块

这个小伙伴们一定轻车熟路了,我也就不再多介绍吧。直接看代码,相信都能看懂。

  1. class LeaderPhone extends StatelessWidget {
      final String leaderImage; 店长图片
      final String leaderPhone; 店长电话
  2.   LeaderPhone({Key key, this.leaderImage,this.leaderPhone}) : super(key: key);
  3.   @override
      Widget build(BuildContext context) {
        return Container(
          child: InkWell(
            onTap: (){},
            child: Image.network(leaderImage),
          ),
        );
      }
    }

2、获取需要的数据

在HomePage里获取获取店长图片和电话数据,并形成变量。

  1. String  leaderImage= data['data']['shopInfo']['leaderImage'];  //店长图片
    String  leaderPhone = data['data']['shopInfo']['leaderPhone']; //店长电话 

有了数据之后,就可以调用这个自己写的组件了。调用方法如下:

  1.   LeaderPhone(leaderImage:leaderImage,leaderPhone: leaderPhone)  广告组件  

3、url_launcher的简介

官方介绍:

A Flutter plugin for launching a URL in the mobile platform. Supports iOS and Android.

意思是用于在移动平台中启动URL的Flutter插件,适用于IOS和Android平台。他可以打开网页,发送邮件,还可以拨打电话。

github地址:https://github.com/flutter/plugins/tree/master/packages/url_launcher

引入依赖

在pubspec.yaml文件里注册依赖,并保存下载包。请注意使用最新版。

  1. url_launcher: ^5.0.1

在需要使用的页面在使用import引入具体的url_launcher包。

  1. import 'package:url_launcher/url_launcher.dart';

4、改造店长电话组件

有了url_launcher插件就后,我们就可以实现拨打电话功能了,不过要简单的改造一下拨打电话模块的代码,改造后的代码如下。

  1. class LeaderPhone extends StatelessWidget {
      final String leaderImage; 店长图片
      final String leaderPhone; 店长电话
  2.   LeaderPhone({Key key, this.leaderImage,this.leaderPhone}) : super(key: key);
  3.   @override
      Widget build(BuildContext context) {
        return Container(
          child: InkWell(
            onTap:_launchURL,
            child: Image.network(leaderImage),
          ),
        );
      }
  4.   void _launchURL() async {
        String url = 'tel:'+leaderPhone;
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    }

全部代码:

  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
    import '../service/service_method.dart';
    import 'package:flutter_swiper/flutter_swiper.dart';
    import 'package:flutter_screenutil/flutter_screenutil.dart';
    import 'package:url_launcher/url_launcher.dart';
  3. class HomePage extends StatefulWidget {
      _HomePageState createState() => _HomePageState();
  4. }
  5. class _HomePageState extends State<HomePage> {
  6.   String homePageContent='正在获取数据';
  7.   @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text('百姓生活+'),
            ),
            body:FutureBuilder(
                future: getHomePageContent(),
                builder: (context,snapshot){
                  if(snapshot.hasData){
                    var data = json.decode(snapshot.data.toString());
                    List<Map> swiper = (data['data']['slides'] as List).cast();
                    List<Map> navigatorList = (data['data']['category'] as List).cast(); 类别列表
                    String advertesPicture = data['data']['advertesPicture']['PICTURE_ADDRESS']; 广告图片
                    String  leaderImage= data['data']['shopInfo']['leaderImage'];  店长图片
                    String  leaderPhone = data['data']['shopInfo']['leaderPhone']; 店长电话 
                    return Column(
                      children: <Widget>[
                        SwiperDiy(swiperDataList: swiper,),
                        TopNavigator(navigatorList: navigatorList,),
                        AdBanner(adbanner: advertesPicture,),
                        LeaderPhone(leaderImage: leaderImage,leaderPhone: leaderPhone,)
  8.                   ],
                    );
                  }else{
                      return Center(
                        child: Text("加载中"),
                      );
                  }
                },
            )
        );
      }
    }
  9. 轮播组件
    class SwiperDiy extends StatelessWidget {
  10.   final List swiperDataList;
  11.   SwiperDiy({Key key,this.swiperDataList}):super(key:key);
  12.   @override
      Widget build(BuildContext context) {
        ScreenUtil.instance = ScreenUtil(width: 750,height: 1334)..init(context);
        return Container(
          height: ScreenUtil().setHeight(333),
          width: ScreenUtil().setWidth(750),
          child: Swiper(
              itemCount: swiperDataList.length,
              itemBuilder: (BuildContext context,int index){
                  return Image.network("${swiperDataList[index]['image']}",fit:BoxFit.fill);
              },
              pagination: SwiperPagination(),
              autoplay: true,
          ),
        );
      }
    }
  13. 顶部导航
    class TopNavigator extends StatelessWidget {
  14.   final List navigatorList;
  15.   TopNavigator({this.navigatorList});
  16.   Widget _gradViewItemUi(BuildContext context,item){
        return InkWell(
          onTap: (){print("点击了导航");},
          child: Column(
            children: <Widget>[
              Image.network(item['image'],width: ScreenUtil().setWidth(95),),
              Text(item['mallCategoryName'])
            ],
          ),
        );
      }
  17.   @override
      Widget build(BuildContext context) {
  18.     if(navigatorList.length>10){
          navigatorList.removeRange(10, navigatorList.length);
        }
  19.     return Container(
          height: ScreenUtil().setHeight(320),
          padding: EdgeInsets.all(3.0),
          child: GridView.count(
              crossAxisCount: 5,
              padding: EdgeInsets.all(4.0),
            children: navigatorList.map((item){
              return _gradViewItemUi(context, item);
            }).toList(),
          ),
        );
      }
    }
  20. 广告条
    class AdBanner extends StatelessWidget {
  21.   String adbanner;
  22.   AdBanner({this.adbanner});
  23.   @override
      Widget build(BuildContext context) {
        return Container(
          child: Image.network(adbanner),
        );
      }
    }
  24. 拨打店长电话
    class LeaderPhone extends StatelessWidget {
  25.   final String leaderPhone;
      final String leaderImage;
  26.   LeaderPhone({this.leaderPhone,this.leaderImage});
  27.   @override
      Widget build(BuildContext context) {
        return Container(
          child: InkWell(
            onTap: _launchURL,
            child: Image.network(leaderImage),
          ),
        );
      }
  28.   void _launchURL() async {
        String url = 'tel:'+leaderPhone;
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    }

效果如下图所示:

这时候就可以打开虚拟机进行调试了,需要说的是,有些虚拟机并出不来拨打电话的效果,如果你的虚拟机出不来这个效果,可以使用真机进行测试。

5、本节总结 :

本节主要学习了使用url_launcher来进行打开网页和拨打电话的设置。希望小伙伴们都有所收获。

14-Flutter移动电商实战-ADBanner组件的编写的更多相关文章

  1. 13-Flutter移动电商实战-ADBanner组件的编写

    1.AdBanner组件的编写 我们还是把这部分单独出来,需要说明的是,这个Class你也是可以完全独立成一个dart文件的.代码如下: 广告图片class AdBanner extends Stat ...

  2. Flutter移动电商实战 --(13)ADBanner组件的编写

    1.AdBanner组件的编写 我们还是把这部分单独出来,需要说明的是,这个Class你也是可以完全独立成一个dart文件的.代码如下: 广告图片 class AdBanner extends Sta ...

  3. Flutter移动电商实战 --(17)首页_楼层区域的编写

    1.楼层标题组件 该组件非常简单,只接收一个图片地址,然后显示即可: class FloorTitle extends StatelessWidget { final String picture_a ...

  4. Flutter移动电商实战 --(15)商品推荐区域制作

    1.推荐商品类的编写 这个类接收一个List参数,就是推荐商品的列表,这个列表是可以左右滚动的. /*商品推荐*/ class Recommend extends StatelessWidget { ...

  5. Flutter移动电商实战 --(14)首页_拨打电话操作

    拨打电话的功能在app里也很常见,比如一般的外卖app都会有这个才做.其实Flutter本身是没给我们提供拨打电话的能力的,那我们如何来拨打电话那? 1.编写店长电话模块 这个小伙伴们一定轻车熟路了, ...

  6. Flutter移动电商实战 --(6)dio基础_Get_Post请求和动态组件协作

    上篇文章中,我们只看到了 dio 的使用方式,但并未跟应用关联起来,所以这一篇将 dio 网络请求与应用界面结合起来,当然这也是为以后的实战作基础准备,基础打牢,我们才能飞速前进. 1.案例说明 我们 ...

  7. Flutter移动电商实战 --(20)首页上拉加载更多功能的制作

    这节课学习一下上拉加载效果,其实现在上拉加载的插件有很多,但是还没有一个插件可以说完全一枝独秀,我也找了一个插件,这个插件的优点就是服务比较好,作者能及时回答大家的问题.我觉的选插件也是选人,人对了, ...

  8. Flutter移动电商实战 --(10)使用FlutterSwiper制作轮播效果

    1.引入flutter_swiper插件 flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. 好牛X得介绍,一般敢用“最”的一般都是神级大神,看到这个介绍 ...

  9. Flutter移动电商实战 --(1)项目学习记录

    1.项目相关截图 2.项目知识点梳理图 Dio2.0: Dio是一个强大的 Dart Http 请求库,支持 Restful API.FormData.拦截器.请求取消等操作. Swiper: Swi ...

随机推荐

  1. Centos7 yum方式安装MySQL

    1.下载安装源 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.yum方式安装 yu ...

  2. js中对字符串操作的常见方法(1)

    String类型 创建一个String类型的实例 var stringObject = new String("hello world"); String类型的属性 length; ...

  3. php中让数组顺序随机化,打乱顺序等

    php中有很多排序的函数,sort,rsort,ksort,krsort,asort,arsort,natcasesort,这些函数用来对数组的键或值进行这样,或那样的排序. 可以终究有时候还需要一些 ...

  4. 57 容器(十一)——Collections容器工具类

    Collections是一个工具类,它提供了与集合操作有关的方法,好比数组中的Arrays工具类.(jdk中的工具类名都是xxxs,有关工具类名参考:https://zhuanlan.zhihu.co ...

  5. Win10各个PC版本的差别

    新的电脑有的已经不能够支持安装win7了,也就是说新电脑的硬件支持只能安装win10.那么win10有都有那些版本呢?这些版本之间又有什么样区别?我相信很多人并不是很了解.今天就来整理一下这些资料.据 ...

  6. Java Annontation 注解的学习和理解

    /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...

  7. SpringBoot中使用Interceptor

    https://www.cnblogs.com/chao555/p/9573102.html 1.创建自定义的拦截器并实现HandlerInterceptor接口 package com.demo.c ...

  8. JavaScript 的内置对象和浏览器对象

    JavaScript 中对象通常包括两种类型:内置对象和浏览器对象,此外用户还可以自定义对象. 在 ECMAScript 中,更精确的定义应该分为:本地对象.内置对象和宿主对象. 对象包含两个要素: ...

  9. 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约

    本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...

  10. wamp环境下配置https证书后,网站内容访问受限

    wamp环境下配置https证书后,网站内容访问受限,点击首页链接标签后报错,大致意思是没有权限进行操作. 解决方法:打开apache的http.conf(位置大致如下:项目所在目录\bin\apac ...