刚开始学习,主要是为了熟悉一下组件的基本用法。参考 Flutter | 老孟
Switch(
value: isOpen,
onChanged: (value) {
setState(() {
isOpen = value;
});
})

Switch(
value: isOpen,
activeThumbImage: const AssetImage('lib/assets/img/qq.png'),
onChanged: (value) {
setState(() {
isOpen = value;
});
})
注意:要在 pubspec.yaml文件中进行注册才行
flutter:
uses-material-design: true
assets:
- lib/assets/img/qq.png

class _YcHomeBodyState extends State<YcHomeBody> {
bool isOpen = true;
@override
Widget build(BuildContext context) {
return Column(mainAxisAlignment: MainAxisAlignment.center, children: [
SwitchListTile(
value: isOpen,
title: const Text("是否统一用户协议"),
onChanged: (val) {
setState((){
isOpen = val;
});
})
]);
}
}

Switch 和 SwitchListTile 同样有自适应平台的方法分别是:Switch.adaptive 和 SwitchListTile.adaptive
水平进度组件
无参
class _YcHomeBodyState extends State<YcHomeBody> {
bool isOpen = true;
@override
Widget build(BuildContext context) {
return Column( mainAxisAlignment: MainAxisAlignment.center, children: const [
LinearProgressIndicator()
]);
}
}

有参
LinearProgressIndicator(
value: number, //当前进度
minHeight: 20, //最新高度
semanticsLabel: "当前进度:1", //不知道干啥的,没看出效果
semanticsValue: '11', 不知道干啥的,没看出效果
color: Colors.red //当前进度的颜色
)

CircularProgressIndicator 是圆形进度条,和LinearProgressIndicator用法一样:
class _YcHomeBodyState extends State<YcHomeBody> {
@override
Widget build(BuildContext context) {
return const Center(
child: CircularProgressIndicator()
);
}
}

CupertinoActivityIndicator是ios风格的指示器,CupertinoActivityIndicator不能设置进度,只能一直转
class _YcHomeBodyState extends State<YcHomeBody> {
double number = 0.3;
@override
Widget build(BuildContext context) {
return const Center(
child: CupertinoActivityIndicator(radius:60) //值是半径
);
}
}
注: 需要导入 import 'package:flutter/cupertino.dart';

图片组件是Flutter基础组件之一,和文本组件一样必不可少。图片组件包含Image和Icon两个组件,本质上Icon不属于图片组件,但其外形效果上类似于图片。
在项目中建议优先使用Icon组件,Icon本质上是一种字体,只不过显示的不是文字,而是图标,而Image组件先通过图片解码器将图片解码,所以Icon有如下优点:
Image组件用于显示图片,图片的来源可以是网络、项目中图片或者设备上的图片。
加载网络图片
class _YcHomeBodyState extends State<YcHomeBody> {
double number = 0.3;
@override
Widget build(BuildContext context) {
return Center(
child: Image.network(
"https://profile-avatar.csdnimg.cn/default.jpg", //路径,必填参数
width: 200,
height: 200,
));
}
}

加载本地图片
加载本地图片需要在pubspec.yaml
//加载图片所在的目录,推荐
assets:
- assets/images/
//加载具体的图片
assets:
- assets/images/aa.jpg

class _YcHomeBodyState extends State<YcHomeBody> {
double number = 0.3;
@override
Widget build(BuildContext context) {
return Center(
child: Image.asset(
"lib/assets/img/qq.png", //路径,必填参数
width: 200,
height: 200,
));
}
}

加载设备上的图片
要加载设备(手机)上的图片首先需要获取设备图片的路径,由于不同平台的路径不同,因此路径的获取必须依靠原生支持,如果了解原生(Android和iOS)开发,可以直接使用MethodChannel获取路径,如果不懂原生(Android和iOS)开发,可以使用第三方插件获取路径,这里推荐官方的 path_provider 。
咱们这里直接使用官方推荐的插件:
flutter pub add path_provider 进行下载pubspec.yaml 添加依赖声明dependencies:
path_provider: ^2.0.11
获取目录demo
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
//使用箭头函数简写
main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
//创建widget的唯一标识
const MyApp({Key? key}) : super(key: key);
//重写build方法
@override
Widget build(BuildContext context) {
//返回一个material类型的app
return const MaterialApp(
//指定显示哪一个页面
home: YcHomePage(),
);
}
}
//app的主页面
class YcHomePage extends StatelessWidget {
const YcHomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
//首页需要有导航和内容,这里借助Scaffold来快速创建
return Scaffold(
//导航条
appBar: AppBar(
title: const Text("图片", style: TextStyle(color: Colors.white)),
),
//页面主题内容
body: const YcHomeBody(),
);
}
}
class YcHomeBody extends StatefulWidget {
const YcHomeBody({Key? key}) : super(key: key);
@override
State<YcHomeBody> createState() => _YcHomeBodyState();
}
class _YcHomeBodyState extends State<YcHomeBody> {
//临时目录
Future<Directory?>? _tempDirectory;
//app支持的目录
Future<Directory?>? _appSupportDirectory;
//app资源目录
Future<Directory?>? _appLibraryDirectory;
//app文档目录
Future<Directory?>? _appDocumentsDirectory;
//外部文档目录
Future<Directory?>? _externalDocumentsDirectory;
//外部存储目录
Future<List<Directory>?>? _externalStorageDirectories;
//外部缓存目录
Future<List<Directory>?>? _externalCacheDirectories;
//下载目录
Future<Directory?>? _downloadsDirectory;
//请求临时目录
void _requestTempDirectory() {
setState(() {
_tempDirectory = getTemporaryDirectory();
});
}
//请求app文档目录
void _requestAppDocumentsDirectory() {
setState(() {
_appDocumentsDirectory = getApplicationDocumentsDirectory();
});
}
//请求app支持的目录
void _requestAppSupportDirectory() {
setState(() {
_appSupportDirectory = getApplicationSupportDirectory();
});
}
//请求app资源目录
void _requestAppLibraryDirectory() {
setState(() {
_appLibraryDirectory = getLibraryDirectory();
});
}
//请求外部存储目录
void _requestExternalStorageDirectory() {
setState(() {
_externalDocumentsDirectory = getExternalStorageDirectory();
});
}
//请求外部存储目录列表
void _requestExternalStorageDirectories(StorageDirectory type) {
setState(() {
_externalStorageDirectories = getExternalStorageDirectories(type: type);
});
}
//请求外部缓存目录
void _requestExternalCacheDirectories() {
setState(() {
_externalCacheDirectories = getExternalCacheDirectories();
});
}
//请求下载目录
void _requestDownloadsDirectory() {
setState(() {
_downloadsDirectory = getDownloadsDirectory();
});
}
//单个文件夹组件
Widget _buildDirectory(
BuildContext context, AsyncSnapshot<Directory?> snapshot) {
Text text = const Text('');
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
text = Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) {
text = Text('path: ${snapshot.data!.path}');
} else {
text = const Text('路径无效');
}
}
return Padding(padding: const EdgeInsets.all(16.0), child: text);
}
//文件夹列表组件
Widget _buildDirectories(
BuildContext context, AsyncSnapshot<List<Directory>?> snapshot) {
Text text = const Text('');
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
text = Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) {
final String combined =
snapshot.data!.map((Directory d) => d.path).join(', ');
text = Text('paths: $combined');
} else {
text = const Text('路径无效');
}
}
return Padding(padding: const EdgeInsets.all(16.0), child: text);
}
@override
Widget build(BuildContext context) {
return Center(
child: ListView(
children: [
//临时目录,必须要有对应的构造方法FutureBuilder
Column(children: [
ElevatedButton(
onPressed: _requestTempDirectory,
child: const Text(
'获取临时目录',
),
),
FutureBuilder<Directory?>(
future: _tempDirectory,
builder: _buildDirectory,
),
]),
//获取应用程序文档目录
Column(
children: [
ElevatedButton(
onPressed: _requestAppDocumentsDirectory,
child: const Text("获取应用程序文档目录")),
FutureBuilder<Directory?>(
future: _appDocumentsDirectory,
builder: _buildDirectory,
),
],
),
//获取应用程序支持目录
Column(
children: [
ElevatedButton(
onPressed: _requestAppSupportDirectory,
child: const Text("获取应用程序支持目录")),
FutureBuilder<Directory?>(
future: _appSupportDirectory,
builder: _buildDirectory,
),
],
),
// 请求外部存储目录
Column(
children: [
ElevatedButton(
onPressed: !Platform.isAndroid
? null
: _requestExternalStorageDirectory,
child: Text(!Platform.isAndroid
? '外部存储不可用'
: '获取外部存储目录')),
FutureBuilder<Directory?>(
future: _externalDocumentsDirectory,
builder: _buildDirectory,
),
],
)
],
));
}
}

加载图片demo
大体意思是这样的,但是不知道如何把图片放到这个目录下,失败了😅
class _YcHomeBodyState extends State<YcHomeBody> {
//外部文档目录
Future<Directory?>? _externalDocumentsDirectory;
//请求外部存储目录
void _requestExternalStorageDirectory() {
setState(() {
_externalDocumentsDirectory = getExternalStorageDirectory();
});
}
//单个文件夹组件
Widget _buildDirectory(
BuildContext context, AsyncSnapshot<Directory?> snapshot) {
Text text = const Text('');
String path = '';
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
text = Text('Error: ${snapshot.error}');
} else if (snapshot.hasData) {
text = Text('path: ${snapshot.data!.path}');
path = snapshot.data!.path;
} else {
text = const Text('路径无效');
}
}
if (path != '') {
return Column(
children: [
text,
Image.file(
File('$path/qq.png'),
width: 200,
)
],
);
} else {
return Padding(padding: const EdgeInsets.all(16.0), child: text);
}
}
@override
Widget build(BuildContext context) {
return Center(
child: ListView(
children: [
// 请求外部存储目录
Column(
children: [
ElevatedButton(
onPressed: !Platform.isAndroid
? null
: _requestExternalStorageDirectory,
child: Text(!Platform.isAndroid ? '外部存储不可用' : '获取外部存储目录')),
FutureBuilder<Directory?>(
future: _externalDocumentsDirectory,
builder: _buildDirectory,
),
],
)
],
));
}
}
Icon是图标组件,Icon不具有交互属性,如果想要交互,可以使用IconButton。
加载
Icon(Icons.add)

设置大小和颜色
Icon(
Icons.add,
size: 30,
color: Colors.blue,
)