flutter 高级

1.下拉刷新、上拉加载
    在flutter官方sdk中给我们提供了下拉刷新组件RefreshIndicator,但是没有提供上拉分页加载。
    但是在Flutter ListView中有一个ScrollController属性,来判断是否滚动到底部来做加载更多

    下拉刷新:
        import 'package:flutter/material.dart';
        import 'package:dio/dio.dart';
        import 'dart:convert';
        class Category extends StatefulWidget {
          @override
          _CategoryState createState() => _CategoryState();
        }

        class _CategoryState extends State<Category> {

          List list = [];

          @override
          void initState() {
            super.initState();
            this._getData();
          }

          _getData() async{
              var url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';
              var response = await Dio().get(url);
              print(response);
              setState(() {
                this.list = json.decode(response.data)['result'];
              });
          }

          Future<void> onRefresh() async {
            print('下拉刷新');
            await this._getData();
            return ;
            // 刷新的圈圈消失
            //await Future.delayed(Duration(milliseconds: 2000),(){
            //  print('请求完成');
            //});
          }

          @override
          Widget build(BuildContext context) {
            return Container(
              child: this.list.length>0 ?
                        RefreshIndicator(
                          onRefresh: this.onRefresh,
                          child: ListView.builder(
                              itemCount: this.list.length,
                              itemBuilder: (context,index){
                                return Column(
                                  children: <Widget>[
                                    ListTile(
                                      title: Text(
                                        '${this.list[index]['title']}',
                                        maxLines: 1,
                                        overflow: TextOverflow.ellipsis,
                                      ),
                                    ),
                                    Divider()
                                  ],
                                );
                              }
                          )
                        )
                        :
                        Text('加载中...')
            );
          }
        }

    上拉加载:
        _scrollController.position.pixels 滚动的距离
        _scrollController.position.maxScrollExtent 屏幕总高度

        import 'package:flutter/material.dart';
        import 'package:dio/dio.dart';
        import 'dart:convert';
        class Category extends StatefulWidget {
          @override
          _CategoryState createState() => _CategoryState();
        }

        class _CategoryState extends State<Category> {

          List list = [];
          ScrollController scrollController = new ScrollController();
          int pageNo = 1;

          @override
          void initState() {
            super.initState();
            this._getData();

            // 监听滚动条事件
            scrollController.addListener((){
              // 获取滚动条下拉的距离
              print(scrollController.position.pixels);
              // 获取整个页面的高度
              print(scrollController.position.maxScrollExtent);

              if (scrollController.position.pixels > scrollController.position.maxScrollExtent - 40) {
                this._getData();
              }
            });
          }

          _getData() async{
              var url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=${this.pageNo}';
              var response = await Dio().get(url);
              print(response);
              setState(() {
                this.list.addAll(json.decode(response.data)['result']);
                this.pageNo++;
              });
          }

          Future<void> onRefresh() async {
            print('下拉刷新');
            await this._getData();
            return ;
            // 刷新的圈圈消失
            //await Future.delayed(Duration(milliseconds: 2000),(){
            //  print('请求完成');
            //});
          }

          @override
          Widget build(BuildContext context) {
            return Container(
              child: this.list.length>0 ?
                        RefreshIndicator(
                          onRefresh: this.onRefresh,
                          child: ListView.builder(
                              controller: this.scrollController,
                              itemCount: this.list.length,
                              itemBuilder: (context,index){
                                if (index == this.list.length - 1) {
                                  return Column(
                                    children: <Widget>[
                                      ListTile(
                                        title: Text(
                                          '${this.list[index]['title']}',
                                          maxLines: 1,
                                          overflow: TextOverflow.ellipsis,
                                        ),
                                      ),
                                      Divider(),
                                      _getMoreWidget()
                                    ],
                                  );
                                } else {
                                  return Column(
                                    children: <Widget>[
                                      ListTile(
                                        title: Text(
                                          '${this.list[index]['title']}',
                                          maxLines: 1,
                                          overflow: TextOverflow.ellipsis,
                                        ),
                                      ),
                                      Divider()
                                    ],
                                  );
                                }
                              }
                          )
                        )
                        :
                        _getMoreWidget()
            );
          }
        }

        Widget _getMoreWidget(){
          return Center(
              child: Padding(
                padding: EdgeInsets.all(10),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      '加载中...',
                      style: TextStyle(fontSize: 16),
                    ),
                    CircularProgressIndicator(
                      strokeWidth: 1,
                    )
                  ],
                ),
              ),
          );
        }

2.flutter解析html页面
    第一种方式:flutter_html(第三方pub)
        import 'package:flutter/material.dart';
        import 'package:dio/dio.dart';
        import 'dart:convert';
        import 'package:flutter_html/flutter_html.dart';

        class DetailPage extends StatefulWidget {
          Map arguments;

          DetailPage({Key key, this.arguments}) : super(key: key);

          @override
          _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
        }

        class _DetailPageState extends State<DetailPage> {
          Map arguments;
          List list = [];

          _DetailPageState({this.arguments});

          @override
          void initState() {
            super.initState();
            this._getData();
          }

          _getData() async{
            var url = "http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=${this.arguments['aid']}";
            var response = await Dio().get(url);
            setState(() {
              this.list = json.decode(response.data)['result'];
            });
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
                appBar: AppBar(
                  title: Text(''),
                ),
                body: Center(
                  child: ListView(
                    children: <Widget>[
                      Text('${this.list.length > 0 ? this.list[0]['title'] : ''}'),
                      Container(
                        child: this.list.length > 0 ?
                                      Html(
                                        data: this.list[0]['content'],
                                      )
                                      :
                                      Text(''),
                      )
                    ],
                  ),
                ) // This trailing comma makes auto-formatting nicer for build methods.
            );
          }
        }

    第二种方式:
        webview,使用第三方插件webview_flutter
        前提:
            iOS:
                在ios/Runner/Info.plist配置
                    <dict>
                       <key>io.flutter.embedded_views_preview</key>
                        <true/>
                    </dict>
                    <key>NSAppTransportSecurity</key>
                    <dict>
                        <key>NSAllowsArbitraryLoads</key>
                        <true/>
                    </dict>
            Android:
                在android\app\src\main\AndroidManifest.xml中配置:
                    android:usesCleartextTraffic="true"
        实例:
            import 'package:flutter/material.dart';
            import 'package:webview_flutter/webview_flutter.dart';

            class DetailPage extends StatefulWidget {
              Map arguments;

              DetailPage({Key key, this.arguments}) : super(key: key);

              @override
              _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
            }

            class _DetailPageState extends State<DetailPage> {
              Map arguments;

              _DetailPageState({this.arguments});

              @override
              void initState() {
                super.initState();
                print(this.arguments);
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                    appBar: AppBar(
                      title: Text(''),
                    ),
                    body: WebView(
                        initialUrl: 'http://www.phonegap100.com/newscontent.php?aid=${this.arguments['aid']}'
                    )
                );
              }
            }

3. flutter获取设备信息 以及使用高德api定位
      获取设备信息:
        使用第三方库:device_info
        import 'package:flutter/material.dart';
        import 'package:device_info/device_info.dart';
        import 'dart:io';

        class DetailPage extends StatefulWidget {
          Map arguments;

          DetailPage({Key key, this.arguments}) : super(key: key);

          @override
          _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
        }

        class _DetailPageState extends State<DetailPage> {
          Map arguments;
          static final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
          Map<String, dynamic> _deviceData = <String, dynamic>{};

          _DetailPageState({this.arguments});

          @override
          void initState() {
            super.initState();
            initPlatformState();
          }

          Future<void> initPlatformState() async {
            Map<String, dynamic> deviceData;

            if (Platform.isAndroid) {
              deviceData = _readAndroidBuildData(await deviceInfoPlugin.androidInfo);
            } else if (Platform.isIOS) {
              deviceData = _readIosDeviceInfo(await deviceInfoPlugin.iosInfo);
            }

            setState(() {
              _deviceData = deviceData;
            });
          }

          Map<String, dynamic> _readAndroidBuildData(AndroidDeviceInfo build) {
            return <String, dynamic>{
              'version.securityPatch': build.version.securityPatch,
              'version.sdkInt': build.version.sdkInt,
              'version.release': build.version.release,
              'version.previewSdkInt': build.version.previewSdkInt,
              'version.incremental': build.version.incremental,
              'version.codename': build.version.codename,
              'version.baseOS': build.version.baseOS,
              'board': build.board,
              'bootloader': build.bootloader,
              'brand': build.brand,
              'device': build.device,
              'display': build.display,
              'fingerprint': build.fingerprint,
              'hardware': build.hardware,
              'host': build.host,
              'id': build.id,
              'manufacturer': build.manufacturer,
              'model': build.model,
              'product': build.product,
              'supported32BitAbis': build.supported32BitAbis,
              'supported64BitAbis': build.supported64BitAbis,
              'supportedAbis': build.supportedAbis,
              'tags': build.tags,
              'type': build.type,
              'isPhysicalDevice': build.isPhysicalDevice,
              'androidId': build.androidId,
              'systemFeatures': build.systemFeatures,
            };
          }

          Map<String, dynamic> _readIosDeviceInfo(IosDeviceInfo data) {
            return <String, dynamic>{
              'name': data.name,
              'systemName': data.systemName,
              'systemVersion': data.systemVersion,
              'model': data.model,
              'localizedModel': data.localizedModel,
              'identifierForVendor': data.identifierForVendor,
              'isPhysicalDevice': data.isPhysicalDevice,
              'utsname.sysname:': data.utsname.sysname,
              'utsname.nodename:': data.utsname.nodename,
              'utsname.release:': data.utsname.release,
              'utsname.version:': data.utsname.version,
              'utsname.machine:': data.utsname.machine,
            };
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text(
                    Platform.isAndroid ? 'Android Device Info' : 'iOS Device Info'
                )
              ),
              body: ListView(
                children:  _deviceData.keys.map((String property) {
                  return Row(
                    children: <Widget>[
                      Container(
                        padding: const EdgeInsets.all(10.0),
                        child: Text(
                          property,
                          style: const TextStyle(
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                      ),
                      Expanded(
                          child: Container(
                            padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
                            child: Text(
                              '${_deviceData[property]}',
                              maxLines: 10,
                              overflow: TextOverflow.ellipsis,
                            ),
                          )),
                    ],
                  );
                }).toList()
              ),
            );
          }
        }

      使用高德api定位获取地理位置:
         使用第三方库:amap_location
         配置:https://pub.dev/packages/amap_location#-readme-tab-
            import 'package:flutter/material.dart';
            import 'package:amap_location/amap_location.dart';

            class DetailPage extends StatefulWidget {
              Map arguments;

              DetailPage({Key key, this.arguments}) : super(key: key);

              @override
              _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
            }

            class _DetailPageState extends State<DetailPage> {
              Map arguments;
              _DetailPageState({this.arguments});

              @override
              void initState() {
                super.initState();
                this.getLocation();
              }

              getLocation() async{
                // 启动
                await AMapLocationClient.startup(new AMapLocationOption( desiredAccuracy:CLLocationAccuracy.kCLLocationAccuracyHundredMeters  ));

                // 获取地理位置
                var result = await AMapLocationClient.getLocation(true);
                print("经度:${result.longitude}");
                print("维度:${result.latitude}");
                print("地理位置:${result.country},${result.district}");
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                  appBar: AppBar(
                    title: Text('地理定位')
                  ),
                  body: ListView(
                    children: [

                    ],
                  )
                );
              }
            }

4. 照相机拍照和相册选择 以及拍照上传到服务器
    第三方库 image_picker
        import 'package:flutter/material.dart';
        import 'package:image_picker/image_picker.dart';
        import 'package:dio/dio.dart';
        import 'package:fluttertoast/fluttertoast.dart';
        
        class DetailPage extends StatefulWidget {
          Map arguments;
        
          DetailPage({Key key, this.arguments}) : super(key: key);
        
          @override
          _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
        }
        
        class _DetailPageState extends State<DetailPage> {
          Map arguments;
          var image;
          _DetailPageState({this.arguments});
        
          @override
          void initState() {
            super.initState();
          }
        
          takePhoto() async {
            var image = await ImagePicker.pickImage(
                                  source: ImageSource.camera,
                                  maxWidth: 400
                               );
            print("image ${image}");
            this.setState(() {
              this.image = image;
            });
          }
        
          choicePhoto() async{
            var image = await ImagePicker.pickImage(
                source: ImageSource.gallery,
                maxWidth: 400
            );
            this.setState(() {
              this.image = image;
            });
          }
        
          uploadPhoto(imgDir) async{
            FormData formData = FormData.fromMap({
              "file": await MultipartFile.fromFile(imgDir.path,filename: "upload.jpg")
            });
            var response = await Dio().post("http://jd.itying.com/imgupload",data: formData);
            print("response ${response.data['success']}");
            if (response.statusCode == 200) {
              Fluttertoast.showToast(msg: '上传成功');
            }
          }
        
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('照相机')
              ),
              body: ListView(
                children: [
                  RaisedButton(
                    child: Text('拍照'),
                    onPressed: this.takePhoto,
                  ),
                  RaisedButton(
                    child: Text('选取照片'),
                    onPressed: this.choicePhoto,
                  ),
                  RaisedButton(
                    child: Text('上传图片'),
                    onPressed: (){
                      this.uploadPhoto(this.image);
                    },
                  ),
                  Container(
                    child: this.image == null ? 
                              Text('清拍照')
                              :
                              Image.file(this.image)
                            ,
                  )
                ],
              )
            );
          }
        }
5.Flutter视频播放
    第三方库(chewie、video_player)
    实例:
        import 'package:flutter/material.dart';
        import 'package:video_player/video_player.dart';
        import 'package:chewie/chewie.dart';

        class DetailPage extends StatefulWidget {
          Map arguments;

          DetailPage({Key key, this.arguments}) : super(key: key);

          @override
          _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
        }

        class _DetailPageState extends State<DetailPage> {
          Map arguments;
          VideoPlayerController videoPlayerController;
          ChewieController chewieController;
          _DetailPageState({this.arguments});

          @override
          void initState() {
            super.initState();
            this.videoPlayerController = VideoPlayerController.network('https://rocketsystem.oss-cn-shanghai.aliyuncs.com/Course/Medias/106fa2617e6f499d9fbcadee42281a95_第一讲+本视频系列的初衷~1.mp4');
            this.chewieController = ChewieController(
              videoPlayerController: this.videoPlayerController,
              aspectRatio: 3 / 2,
              autoPlay: true,
              looping: true
            );
          }

          @override
          void dispose() {
            this.videoPlayerController.dispose();
            this.chewieController.dispose();
            super.dispose();
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('照相机')
              ),
              body: ListView(
                children: [
                  Chewie(
                    controller: this.chewieController,
                  )
                ],
              )
            );
          }
        }

6. 本地存储 封装本地存储类
    使用第三方库 shared_preferences
        实例:
            import 'package:flutter/material.dart';
            import 'package:shared_preferences/shared_preferences.dart';

            class DetailPage extends StatefulWidget {
              Map arguments;

              DetailPage({Key key, this.arguments}) : super(key: key);

              @override
              _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
            }

            class _DetailPageState extends State<DetailPage> {
              Map arguments;
              _DetailPageState({this.arguments});

              onSave() async{
                  SharedPreferences sp = await SharedPreferences.getInstance();
                  sp.setString("username", "张三");
              }

              getData() async{
                SharedPreferences sp = await SharedPreferences.getInstance();
                String username = sp.getString("username");
                print("username $username");
              }

              removeData() async{
                SharedPreferences sp = await SharedPreferences.getInstance();
                sp.remove("username");
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                  appBar: AppBar(
                    title: Text('照相机')
                  ),
                  body: ListView(
                    children: [
                      RaisedButton(
                        child: Text('保存数据'),
                        onPressed: this.onSave,
                      ),
                      RaisedButton(
                        child: Text('获取数据'),
                        onPressed: this.getData,
                      ),
                      RaisedButton(
                        child: Text('移除数据'),
                        onPressed: this.removeData,
                      )
                    ],
                  )
                );
              }
            }

        简单封装:
            import 'package:shared_preferences/shared_preferences.dart';
            class Storage {
              static Future<void> setString(key, value) async{
                SharedPreferences sp = await SharedPreferences.getInstance();
                sp.setString(key, value);
              }

              static Future<String> getString(key) async{
                SharedPreferences sp = await SharedPreferences.getInstance();
                return sp.getString(key);
              }
            }

7. 检测网络连接
    第三方包 connectivity
        实例:
            import 'package:flutter/material.dart';
            import 'package:connectivity/connectivity.dart';

            class DetailPage extends StatefulWidget {
              Map arguments;

              DetailPage({Key key, this.arguments}) : super(key: key);

              @override
              _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
            }

            class _DetailPageState extends State<DetailPage> {
              Map arguments;
              var subscription;
              _DetailPageState({this.arguments});

              @override
              initState() {
                super.initState();

                subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
                  if (result == ConnectivityResult.wifi) {
                    print('手机wifi在线');
                  } else if (result == ConnectivityResult.mobile) {
                    print('手机网络在线');
                  } else if (result == ConnectivityResult.none) {
                    print('手机无网络');
                  }
                });
              }

              @override
              dispose() {
                super.dispose();
                subscription.cancel();
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                  appBar: AppBar(
                    title: Text('网络')
                  ),
                  body: ListView(
                    children: [

                    ]
                  )
                );
              }
            }

8. 扫码(二维码、条形码)
    第三方 barcode_scan
    实例:
        import 'package:flutter/material.dart';
        import 'package:barcode_scan/barcode_scan.dart';

        class DetailPage extends StatefulWidget {
          Map arguments;

          DetailPage({Key key, this.arguments}) : super(key: key);

          @override
          _DetailPageState createState() => _DetailPageState(arguments: this.arguments);
        }

        class _DetailPageState extends State<DetailPage> {
          Map arguments;
          String scanContent = '等待扫码';
          _DetailPageState({this.arguments});

          Future scan() async {
            var barcode = await BarcodeScanner.scan();
            this.setState(() {
              this.scanContent = barcode.rawContent;
            });
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('扫码')
              ),
              body: ListView(
                children: [
                  RaisedButton.icon(
                      icon: Icon(Icons.photo_camera),
                      label: Text('扫码'),
                      onPressed: this.scan
                  ),
                  Text(this.scanContent)
                ]
              )
            );
          }
        }

9. 检测应用版本号、服务器下载文件以及实现App自动升级、安装
    (1)获取本地版本号
    (2)请求服务器获取服务器版本号
    (3)本地版本和服务器版本不一致提示升级,弹框提示更新
    (4)用户确定升级,调用文件传输方式下载apk文件
    (5)监听下载速度
    (6)下载完成打卡apk进行安装
    注意:Ios没有办法直接下载,需要跳转到IOS应用对应的应用市场

    Android升级app涉及的库:
        package_info 检测版本号
        path_provider 获取文件存储路径
        flutter_downloader 下载新的apk
        open_file 打开文件插件

    实例:
        import 'package:flutter/material.dart';
        import 'package:package_info/package_info.dart';
        import 'package:path_provider/path_provider.dart';
        import 'package:flutter_downloader/flutter_downloader.dart';
        import 'dart:io';

        import 'package:open_file/open_file.dart';

        class MyFirstPagePage extends StatefulWidget {
          Map arguments;

          MyFirstPagePage({Key key, this.arguments}) : super(key: key);

          @override
          _MyFirstPagePageState createState() =>
              _MyFirstPagePageState(arguments: this.arguments);
        }

        class _MyFirstPagePageState extends State<MyFirstPagePage> {
          Map arguments;

          _MyFirstPagePageState({this.arguments});

          @override
          void initState() {
            super.initState();
            this._getPackageInfo();
            this._getAppPath();
            this._initDownload();
          }

          _initDownload() async{
            WidgetsFlutterBinding.ensureInitialized();
            await FlutterDownloader.initialize(
                debug: true // optional: set false to disable printing logs to console
            );
          }

          _getPackageInfo() async{
            PackageInfo packageInfo = await PackageInfo.fromPlatform();
            String appName = packageInfo.appName;
            String packageName = packageInfo.packageName;
            String version = packageInfo.version;
            String buildNumber = packageInfo.buildNumber;


            print("appName:${appName}");
            print("packageName:${packageName}");
            print("version:${version}");
            print("buildNumber:${buildNumber}");
          }

          _getAppPath() async{
            Directory tempDir = await getTemporaryDirectory();
            String tempPath = tempDir.path;

            Directory appDocDir = await getApplicationDocumentsDirectory();
            String appDocPath = appDocDir.path;

            var directory = await getExternalStorageDirectory();
            String storageDirectory=directory.path;


            print("tempPath:${tempPath}");
            print("appDocDir:${appDocPath}");
            print("StorageDirectory:${storageDirectory}");
          }

          _downLoad() async{
            final directory = await getExternalStorageDirectory();
            String _localPath = directory.path;

            final taskId = await FlutterDownloader.enqueue(
              url: "http://www.ionic.wang/jdshop.apk",
              savedDir: _localPath,
              showNotification:
              true,
              openFileFromNotification:
              true,
            );
            //打开文件
            OpenFile.open("${_localPath}/jdshop.apk");
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
                appBar: AppBar(
                  title: Text(''),
                ),
                body: Center(
                  child: Column(
                    children: [
                      RaisedButton.icon(
                          icon: Icon(Icons.arrow_downward),
                          label: Text('下载升级'),
                          onPressed: this._downLoad,
                      )
                    ],
                  ),
                ) // This trailing comma makes auto-formatting nicer for build methods.
            );
          }
        }

10. 打开外部浏览器 打开外部应用 拨打电话 发送短信
    使用第三方包: url_launcher
        import 'package:flutter/material.dart';
        import 'package:url_launcher/url_launcher.dart';

        class MyFirstPagePage extends StatefulWidget {
          Map arguments;

          MyFirstPagePage({Key key, this.arguments}) : super(key: key);

          @override
          _MyFirstPagePageState createState() =>
              _MyFirstPagePageState(arguments: this.arguments);
        }

        class _MyFirstPagePageState extends State<MyFirstPagePage> {
          Map arguments;

          _MyFirstPagePageState({this.arguments});

          @override
          Widget build(BuildContext context) {
            return Scaffold(
                appBar: AppBar(
                  title: Text(''),
                ),
                body: Center(
                  child: Column(
                    children: [
                      RaisedButton(
                        child: Text('打开外部链接'),
                        onPressed: () async{
                          const url = 'https://flutter.cn';
                          if (await canLaunch(url)) {
                            await launch(url);
                          } else {
                            throw 'Could not launch $url';
                          }
                        },
                      ),
                      RaisedButton(
                        child: Text('拨打电话'),
                        onPressed: () async{
                          const tel = 'tel:13041895753';
                          if (await canLaunch(tel)) {
                            await launch(tel);
                          } else {
                            throw 'Could not launch $tel';
                          }
                        },
                      ),
                      RaisedButton(
                        child: Text('发送短信'),
                        onPressed: () async{
                          const sms = 'sms:13041895753';
                          if (await canLaunch(sms)) {
                            await launch(sms);
                          } else {
                            throw 'Could not launch $sms';
                          }
                        },
                      ),
                      RaisedButton(
                        child: Text('打开外部应用'),
                        onPressed: () async{
                          const url = 'weixin://';
                          if (await canLaunch(url)) {
                            await launch(url);
                          } else {
                            throw 'Could not launch $url';
                          }
                        },
                      ),
                      RaisedButton(
                        child: Text('发送邮件'),
                        onPressed: () async{
                          const url = 'mailto:2957009914@qq.com';
                          if (await canLaunch(url)) {
                            await launch(url);
                          } else {
                            throw 'Could not launch $url';
                          }
                        },
                      )
                    ],
                  ),
                ) // This trailing comma makes auto-formatting nicer for build methods.
            );
          }
        }


11. 支付宝支付
       第三方包 sy_flutter_alipay
       实例:
            import 'package:flutter/material.dart';
            import 'package:sy_flutter_alipay/sy_flutter_alipay.dart';
            import 'package:dio/dio.dart';

            class MyFirstPagePage extends StatefulWidget {
              Map arguments;

              MyFirstPagePage({Key key, this.arguments}) : super(key: key);

              @override
              _MyFirstPagePageState createState() =>
                  _MyFirstPagePageState(arguments: this.arguments);
            }

            class _MyFirstPagePageState extends State<MyFirstPagePage> {
              Map arguments;

              _MyFirstPagePageState({this.arguments});

              alipay() async{
                var serverData = await Dio().get('http://agent.itying.com/alipay/');

                // 签名后的订单信息
                var payInfo = serverData.data;
                var result = await SyFlutterAlipay.pay(
                    payInfo,
                    // 如果是IOS支付需要提供唯一的urlScheme
                    // urlScheme: 'wq'
                );
                print(result);
              }

              @override
              Widget build(BuildContext context) {
                return Scaffold(
                    appBar: AppBar(
                      title: Text(''),
                    ),
                    body: Center(
                      child: Column(
                        children: [
                          RaisedButton.icon(
                              onPressed: this.alipay,
                              icon: Icon(Icons.monetization_on),
                              label: Text('支付宝支付')
                          )
                        ],
                      )
                    ) // This trailing comma makes auto-formatting nicer for build methods.
                );
              }
            }

12. 微信支付
    第三方包:sy_flutter_wechat
        import 'package:flutter/material.dart';
        import 'package:sy_flutter_wechat/sy_flutter_wechat.dart';
        import 'package:dio/dio.dart';
        import 'dart:convert';

        class MyFirstPagePage extends StatefulWidget {
          Map arguments;

          MyFirstPagePage({Key key, this.arguments}) : super(key: key);

          @override
          _MyFirstPagePageState createState() =>
              _MyFirstPagePageState(arguments: this.arguments);
        }

        class _MyFirstPagePageState extends State<MyFirstPagePage> {
          Map arguments;

          _MyFirstPagePageState({this.arguments});

          @override
          void initState() {
            super.initState();
            _register();
          }

          _register() async {
            bool result = await SyFlutterWechat.register('wx5881fa2638a2ca60');
            print("_register $result");
          }

          @override
          Widget build(BuildContext context) {
            return Scaffold(
                appBar: AppBar(
                  title: Text(''),
                ),
                body: Center(
                  child: Column(
                    children: [
                      RaisedButton(
                        child: Text('分享文字'),
                        onPressed: () async {
                          bool res = await SyFlutterWechat.shareText('hello world',
                              shareType: SyShareType.session);
                          print('分享文字:' + res.toString());
                        },
                      ),
                      RaisedButton(
                        child: Text('分享图片'),
                        onPressed: () async {
                          bool res = await SyFlutterWechat.shareImage(
                              'https://avatars0.githubusercontent.com/u/10024776',
                              shareType: SyShareType.timeline);
                          print('分享图片:' + res.toString());
                        },
                      ),
                      RaisedButton(
                        child: Text('分享网页'),
                        onPressed: () async {
                          bool res = await SyFlutterWechat.shareWebPage(
                              '标题',
                              '描述',
                              'https://avatars0.githubusercontent.com/u/10024776',
                              'http://www.example.com',
                              shareType: SyShareType.session);
                          print('分享网页:' + res.toString());
                        },
                      ),
                      RaisedButton(
                        child: Text('支付'),
                        onPressed: () async {
                          var apiUrl='http://agent.itying.com/wxpay/';
                          var myPayInfo =await Dio().get(apiUrl);

                          Map myInfo =json.decode(myPayInfo.data);
                          print(myInfo);

                          var payInfo={
                            "appid":myInfo["appid"].toString(),
                            "partnerid":myInfo["partnerid"].toString(),
                            "prepayid":myInfo["prepayid"].toString(),
                            "package":myInfo["package"].toString(),
                            "noncestr":myInfo["noncestr"].toString(),
                            "timestamp":myInfo["timestamp"].toString(),
                            "sign":myInfo["sign"].toString(),
                          };

                          SyPayResult payResult = await SyFlutterWechat.pay(
                              SyPayInfo.fromJson(payInfo));
                          print("payResult $payResult");
                        },
                      ),
                    ],
                  )
                ) // This trailing comma makes auto-formatting nicer for build methods.
            );
          }
        }
        
13. Provider的使用
		(1)新建Provider文件夹,在此文件夹下新建Counter.dart
				import 'package:flutter/material.dart';
					class Counter with ChangeNotifier{
					  int count = 1;
					  int get getCount => count; // 获取状态
					  incCount(count) {
					    this.count = count;
					    notifyListeners();  // 表示更新状态
					  }
				}
		(2)在main.dart中修改:
				import 'package:flutter/material.dart';
				import 'package:provider/provider.dart';
				import 'provider/Counter.dart';
				import 'routes.dart';
				void main() => runApp(MyApp());
				class MyApp extends StatefulWidget {
				  @override
				  _MyAppState createState() => _MyAppState();
				}
				class _MyAppState extends State<MyApp> {
				  @override
				  Widget build(BuildContext context) {
				    return MultiProvider(
				      providers: [
				        ChangeNotifierProvider(builder: (_) => Counter())
				      ],
				      child: MaterialApp(
				        title: '京东商城',
				        initialRoute: '/',
				        debugShowCheckedModeBanner: false,
				        onGenerateRoute: onGenerateRoute,
				        theme: ThemeData(
				            primaryColor: Colors.white
				        ),
				      ),
				    );
				  }
				}
		(3)页面中使用		
			import 'package:flutter/material.dart';
			import 'package:provider/provider.dart';
			import '../../provider/Counter.dart';
			
			class Cart extends StatefulWidget {
			  @override
			  _CartState createState() => _CartState();
			}
			class _CartState extends State<Cart> with AutomaticKeepAliveClientMixin{
			  bool get wantKeepAlive => true;
			  @override
			  Widget build(BuildContext context) {
			    var CounterProvider = Provider.of<Counter>(context);
			    return Scaffold(
			      body: Container(
			        child: Center(
			          child: Column(
			            children: <Widget>[
			              Text("${CounterProvider.getCount}"),
			              RaisedButton(
			                onPressed: (){
			                  CounterProvider.incCount(5);
			                },
			                child: Text('点击'),
			              )
			            ],
			          ),
			        ),
			      ),
			    );
			  }
			}

14. 事件广播 事件监听 event_bus
		(1)新建EventBus.dart
				import 'package:event_bus/event_bus.dart';
					EventBus eventBus = EventBus();
					class ProductDetailEvent{
					  String str;
					  ProductDetailEvent(String str){
					    this.str = str;
					  }
				}
		(2)监听事件
				import 'EventBus.dart';
				// 监听ProductDetailEvent广播
			    this.eventAction = eventBus.on<ProductDetailEvent>().listen((event){
			      print("event ${event.str}");
			      this.attrBottomSheet();
			    });
				// 组件销毁时要取消事件监听
				@override
				  void dispose() {
				    super.dispose();
				    // 取消事件监听
				    this.eventAction.cancel();
				  }
		(3)触发事件
			RasiedButton(
				onPress(){
					// 广播
	           		eventBus.fire(ProductDetailEvent('加入购物车'));
				}
			)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值