Flutter 常用的特殊组件

1、Cupertino

Cupertino -- iOS风格的组件

引用:import 'package:flutter/cupertino.dart';
文档:https://flutter.cn/docs/development/ui/widgets/cupertino
 
Material -- 安卓风格的组件

引用:import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:io';

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Widget dialogBox = Container();
    // 判断当前的平台信息
    // iOS
    if (Platform.isIOS) {
      dialogBox = const CupertinoDialog();
    }
    // Android
    if (Platform.isAndroid) {
      dialogBox = const MaterialDialog();
    }
    return Scaffold(
      appBar: AppBar(
        title: const Text('Dialog'),
      ),
      body: dialogBox,
    );
  }
}

// 安卓风格的弹窗
class MaterialDialog extends StatelessWidget {
  const MaterialDialog({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 10),
      child: AlertDialog(
        title: const Text('提示'),
        content: const Text('确认删除吗?'),
        actions: [
          TextButton(onPressed: () {}, child: const Text('取消')),
          TextButton(onPressed: () {}, child: const Text('确认')),
        ],
      ),
    );
  }
}

// iOS风格的弹窗
class CupertinoDialog extends StatelessWidget {
  const CupertinoDialog({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 10),
      child: CupertinoAlertDialog(
        title: const Text('提示'),
        content: const Text('确认删除吗?'),
        actions: [
          CupertinoDialogAction(
            child: const Text('取消'),
            onPressed: () {},
          ),
          CupertinoDialogAction(
            child: const Text('确认'),
            onPressed: () {},
          ),
        ],
      ),
    );
  }
}

 

2、SafeArea

该组件会为其子组件插入足够的内边距以避免操作系统的影响,例如:iPhone X 的刘海屏

文档:https://api.flutter-io.cn/flutter/widgets/SafeArea-class.html

 
 
3、dio

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...

pub地址:https://pub.dev/packages/dio
中文文档:https://github.com/flutterchina/dio/blob/master/README-ZH.md

安装:flutter pub add dio

引入:import 'package:dio/dio.dart';
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  // 异步获取图片
  void getPic() async {
    try {
      var response =
          await Dio().get('https://dog.ceo/api/breed/hound/images/random');
      print(response);
      print(response.data);
      print(response.data['message']);
      print(response.data['status']);
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('dio'),
      ),
      body: Container(
        width: double.infinity,
        padding: const EdgeInsets.all(10),
        child: ElevatedButton(
          // 点击事件,调用 HTTP 请求
          onPressed: getPic,
          child: const Text('点击发送请求'),
        ),
      ),
    );
  }
}

 

4、flutter_swiper

Flutter 中最好的轮播组件,支持多种布局、无限滚动,可同时兼容 Android 和 iOS

文档:https://pub.flutter-io.cn/packages/flutter_swiper
安装:flutter pub add flutter_swiper
使用:import 'package:flutter_swiper/flutter_swiper.dart';

基本属性:
scrollDirection:默认值 Axis.horizontal,轮播的方向
loop:默认值 true,取值为 false 时,禁止无限滚动
index:默认值 0,初始的下标
autoplay:默认值 false,取值为 true 时,启动自动轮播
duration:默认值 3000ms,每次动画(轮播切换)耗时

分页器 Pagination 属性:
继承自 SwiperPlugin,为 Swiper 提供了额外的 UI,通过 new SwiperPagination() 来创建 pagination

alignment:默认值 Alignment.bottomCenter,分页器的位置
margin:默认值 EdgeInsets.all(10.0),与父容器的间距
builder:默认值 SwiperPagination.dots,两种不同的样式 SwiperPagination.dots 和 SwiperPagination.fraction
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';

class Home extends StatelessWidget {
  const Home({
    Key? key,
    this.imgs = const [
      'assets/image1.jpg',
      'assets/image2.jpg',
      'assets/image3.jpg'
    ],
  }) : super(key: key);

  final List<String> imgs;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('轮播图'),
      ),
      body: ListView(
        children: [
          const Text(
            '轮播图基本用法:',
            style: TextStyle(
              fontSize: 32,
            ),
            textAlign: TextAlign.left,
          ),
          Container(
            padding: const EdgeInsets.symmetric(horizontal: 10),
            height: 150,
            child: Swiper(
              autoplay: true,
              itemCount: imgs.length,
              itemBuilder: (context, index) {
                return Image.asset(
                  imgs[index],
                  fit: BoxFit.cover,
                );
              },
              // 默认的分页器(轮播图的指示点)
              pagination: const SwiperPagination(),
              // 默认的控制器(左右箭头导航)
              control: const SwiperControl(),
            ),
          ),
          const Text(
            '轮播图3D效果:',
            style: TextStyle(
              fontSize: 32,
            ),
            textAlign: TextAlign.left,
          ),
          Container(
            padding: const EdgeInsets.symmetric(horizontal: 10),
            height: 150,
            child: Swiper(
              autoplay: true,
              itemCount: imgs.length,
              itemBuilder: (context, index) {
                return Image.asset(
                  imgs[index],
                  fit: BoxFit.cover,
                );
              },
              // 主轮播图的缩放比例,默认是1
              viewportFraction: 0.7,
              // 非主轮播图的缩放比例
              scale: 0.7,
            ),
          ),
          const Text(
            '轮播图布局:',
            style: TextStyle(
              fontSize: 32,
            ),
            textAlign: TextAlign.left,
          ),
          Container(
            padding: const EdgeInsets.symmetric(horizontal: 10),
            height: 150,
            child: Swiper(
              autoplay: true,
              itemCount: imgs.length,
              itemBuilder: (context, index) {
                return Image.asset(
                  imgs[index],
                  fit: BoxFit.cover,
                );
              },
              itemWidth: 300,
              // 当 layout 取值为 TINDER 时,必须指明高度,否则会报错
              // itemHeight: 150,
              // layout: SwiperLayout.TINDER,
              layout: SwiperLayout.STACK,
            ),
          ),
        ],
      ),
    );
  }
}

 

 5、shared_preferences

是一个异步的本地数据缓存库,支持的数据类型有:int, double, bool, String, List<String>

文档:https://pub.flutter-io.cn/packages/shared_preferences
安装:flutter pub add shared_preferences
引用:import 'package:shared_preferences/shared_preferences.dart';
使用:SharedPreferences prefs = await SharedPreferences.getInstance();

增/改:setString(key, value)
查:getString(key)
删:remove(key), clear()
 
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('shared_preferences'),
      ),
      body: Container(
        width: double.infinity,
        padding: const EdgeInsets.all(10),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _incrementCounter,
              child: const Text('递增'),
            ),
            ElevatedButton(
              onPressed: _decrementCounter,
              child: const Text('递减'),
            ),
            ElevatedButton(
              onPressed: _removeCounter,
              child: const Text('删除'),
            ),
            ElevatedButton(
              onPressed: _addStr,
              child: const Text('缓存字符串'),
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.pink),
              ),
            ),
            ElevatedButton(
              onPressed: _getStr,
              child: const Text('读取字符串'),
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.pink),
              ),
            ),
            ElevatedButton(
              onPressed: _clearPrefs,
              child: const Text('清空'),
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.pink),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // 递增
  _incrementCounter() async {
    // 获取保存实例
    SharedPreferences prefs = await SharedPreferences.getInstance();
    // 需要注意运算的优先级 + 先于 ?? 执行
    int counter = (prefs.getInt('counter') ?? 0) + 1;
    print('Pressed $counter times.');
    await prefs.setInt('counter', counter);
  }

  // 递减
  _decrementCounter() async {
    // 获取保存实例
    SharedPreferences prefs = await SharedPreferences.getInstance();
    int counter = prefs.getInt('counter') ?? 0;
    if (counter > 0) {
      counter--;
    }
    print('Pressed $counter times.');
    await prefs.setInt('counter', counter);
  }

  // 删除
  _removeCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.remove('counter');
  }

  // 缓存字符串
  _addStr() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString('msg', 'Hello World !');
  }

  // 读取缓存
  _getStr() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String msg = prefs.getString('msg') ?? '';
    print('缓存的字符串内容是:$msg');
  }

  // 清空所有缓存内容
  _clearPrefs() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.clear();
  }
}

 

 
posted @ 2022-05-18 15:21  rogerwu  阅读(447)  评论(0编辑  收藏  举报