赞
踩
刚开始学习,主要是为了熟悉一下组件的基本用法。参考 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
大体意思是这样的,但是不知道如何把图片放到这个目录下,失败了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。