开篇寄语
伯衡君这一个月正在学习Flutter这门编程语言以制作自己的一个Android和iOS以及Web端的全平台App,感觉入门相对来说未找到捷径,那么姑且做些笔记来整理思路,把复杂的事情分解成一个个简单的内容,以达成最终的目的,所以伯衡君准备将Flutter按照各个部件来拆分学习,想到此前学习Web开发时,也是先html,css,javascript这些开始学习的,为了提高效率,缩短学习时间,毕竟人生短暂,必须有另外一番捷径可循,让我们开始吧。
前情提要
- 《Flutter2发布,一套代码适用全系统应用开发以及Web应用》
- 《如何在Mac M1芯片电脑上安装Flutter并建立自己第一个全系统应用》
- 《如何在Windows电脑上安装Flutter并建立自己第一个全系统应用》
内容详情
以下内容大多是更改lib下的main.dart文件内容,删掉里面的内容,复制粘贴代码,开启调试就可以出现了
Icon
- 是指一些小图标,这在美化页面,丰富内容上起到很大作用,而在Flutter中设置也非常简单,内置了很多Icon图标,只需要输入相应的代码进行调用就可以了,以下面的例子来说
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: Center( child: Icon( Icons.bluetooth, color: Theme.of(context).primaryColor, size: 32.0, ), ), )); } }
生成效果如下图所示:
其中Icons.bluetooth是中间的蓝牙标志,在Flutter的库中,有庞大的图标可以使用,详情请点此移步到官方图标库:
比如Icons.favorite就是心形的图案,总之,各种内置的图标非常多,足够在大部分情况使用。
Text
- Flutter中的文字,可以输出任何内容,进行样式的设置,如下所示:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: Center( child: const Text('Hello World', style: TextStyle( color: Color(0xFFFF0000), backgroundColor: Colors.yellow, fontSize: 42.0, fontStyle: FontStyle.italic, decoration: TextDecoration.underline))), )); } }
生成效果如下图所示:
更多有关Text的样式设置,以及方法的使用,则可移步到官网的这个页面:
TextField
- 该组件多是用户输入内容,包括输入用户名,密码,评论之类的,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: Center( child: Container( width: 400.0, child: TextField( keyboardType: TextInputType.name, style: Theme.of(context).textTheme.headline5, maxLength: 36, decoration: InputDecoration( icon: const Icon(Icons.people), labelText: 'Please enter a user name', // ignore: dead_code errorText: true ? null : 'Please enter your name', ), )))), ); } }
生成效果如下图所示:
另外的一种用于评论或者撰写多行文本的输入框,示例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: Center( child: Container( width: 400.0, child: TextField( maxLines: 5, ), ))), ); } }
生成效果如下图所示:
TextFormField
- 相当于一个表格,填写信息,比如用户名,密码登陆,试举例如下:
/// Flutter code sample for TextFormField // This example shows how to move the focus to the next field when the user // presses the SPACE key. import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => runApp(const MyApp()); /// This is the main application widget. class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); static const String _title = 'Flutter Code Sample'; @override Widget build(BuildContext context) { return const MaterialApp( title: _title, home: MyStatefulWidget(), ); } } /// This is the stateful widget that the main application instantiates. class MyStatefulWidget extends StatefulWidget { const MyStatefulWidget({Key? key}) : super(key: key); @override State<MyStatefulWidget> createState() => _MyStatefulWidgetState(); } /// This is the private State class that goes with MyStatefulWidget. class _MyStatefulWidgetState extends State<MyStatefulWidget> { @override Widget build(BuildContext context) { return Material( child: Center( child: Shortcuts( shortcuts: const <ShortcutActivator, Intent>{ // Pressing space in the field will now move to the next field. SingleActivator(LogicalKeyboardKey.space): NextFocusIntent(), }, child: FocusTraversalGroup( child: Form( autovalidateMode: AutovalidateMode.always, onChanged: () { Form.of(primaryFocus!.context!)!.save(); }, child: Wrap( children: List<Widget>.generate(4, (int index) { return Padding( padding: const EdgeInsets.all(8.0), child: ConstrainedBox( constraints: BoxConstraints.tight(const Size(200, 50)), child: TextFormField( onSaved: (String? value) { print('Value for field $index saved as "$value"'); }, ), ), ); }), ), ), ), ), ), ); } }
生成效果如下图所示:
Image
- 图片,Flutter设置图片也是十分简单,而且形式多样,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: Center( child: Container( width: 400.0, child: const Image( image: NetworkImage( 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg'), )))), ); } }
生成效果如下图所示:
- 或者在本地引用也可以,试举例如下:
首先是在项目目录内创建一个新的文件夹,取名为assets,伯衡君根据个人需要会在该文件夹下面新建一个文件夹名为images,如下图所示:
接下来是修改pubspec.yaml文件,其中有一段代码是修改图片索引的:
flutter: assets: - assets/images/
这样设置是设置为索引文件夹assets/images内的所有图片。
接下来就是修改main.dart文件,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Column( children: <Widget>[ Image.asset('images/dartside.png'), ], ), ), ), ); } }
生成效果如下图所示:
Card
- 该组件类似于卡片,矩形,正方形等等,总之是一个可以让应用整齐美观的重要组件,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Column( children: <Widget>[ Card( color: Colors.green, margin: const EdgeInsets.all(20.0), elevation: 0.0, child: SizedBox( height: 100.0, child: InkWell( splashColor: Colors.deepOrange, onTap: () { print('Clicked!'); }, child: Row( children: const <Widget>[ Expanded( child: Text('Card'), ), ], ), ), ), ), ], ), ), ), ); } }
生成的效果如下图所示:
简单来说,就是生成的卡片点击后会有颜色改变,同时在调试窗口生成点击的记录。
Gradient
- 这个是一种渐变色,能够让页面看起来更加炫酷,也让色彩搭配更加多变,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), flexibleSpace: Container( decoration: BoxDecoration( gradient: LinearGradient( colors: [ Colors.red.shade400, Colors.blue.shade400, Colors.yellow ], stops: [0.25, 0.5, 1.0], ), ), ), ), body: Center( child: Column( children: <Widget>[ Card( color: Colors.green, margin: const EdgeInsets.all(20.0), elevation: 0.0, child: SizedBox( height: 100.0, child: InkWell( splashColor: Colors.deepOrange, onTap: () { print('Clicked!'); }, child: Row( children: const <Widget>[ Expanded( child: Center( child: Text('Card'), )), ], ), ), ), ), ], ), ), ), ); } }
生成的效果如下图所示:
Button
- 一看就是各种按钮啦,菜单按钮,选择按钮等等,这个涉及的种类比较多,一个个举例学习。
TextButton
- 简单的按钮实现,试举例如下:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Flutter Buttons - FlatButton'), ), body: Center( child: Column(children: <Widget>[ Container( margin: EdgeInsets.all(25), child: TextButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Colors.red)), child: Text( 'Button 2', style: TextStyle(fontSize: 20.0, color: Colors.yellow.shade200), ), onPressed: () { print("Clicked!"); }, ), ), ]))), ); } }
生成的效果如下图所示:
ElevatedButton
- 简单来说是一个带有边界的按钮,比textButton豪华一些,试举例如下:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Flutter Buttons - FlatButton'), ), body: Center( child: Column(children: <Widget>[ Container( width: 200.0, height: 50.0, margin: EdgeInsets.all(25), child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Colors.red)), child: Text( 'Button 2', style: TextStyle(fontSize: 20.0, color: Colors.yellow.shade200), ), onPressed: () { print("Clicked!"); }, ), ), ]))), ); } }
生成的效果如下图所示:
OutlinedButton
- 带有外边的按钮,加了一层装饰而已,类似于TextButton
PopupMenuButton
- 此常用于右上角弹出菜单,以供选择,试举例如下:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { final GlobalKey<PopupMenuButtonState<int>> _key = GlobalKey(); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Menu'), actions: [ PopupMenuButton<int>( key: _key, itemBuilder: (context) { return <PopupMenuEntry<int>>[ PopupMenuItem(child: Text('0'), value: 0), PopupMenuItem(child: Text('1'), value: 1), ]; }, ), ], ), body: Center( child: Column(children: <Widget>[ Container( width: 200.0, height: 50.0, margin: EdgeInsets.all(25), child: OutlinedButton( child: Text( 'Button 2', style: TextStyle(fontSize: 20.0, color: Colors.yellow.shade200), ), onPressed: () { print("Clicked!"); }, ), ), ]))), ); } }
生成的效果如下图所示:
MaterialButton
- 用于构建依赖于环境 ButtonTheme 和 Theme 的 Material 按钮的实用程序类,这个可以制作圆形的按钮等,试举一例:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Flutter Buttons - FlatButton'), ), body: Center( child: MaterialButton( color: Colors.blue, shape: CircleBorder(), onPressed: () {}, child: Padding( padding: const EdgeInsets.all(100), child: Text( 'A circle button', style: TextStyle(color: Colors.white, fontSize: 24), ), ), ), ), ), ); } }
生成效果如下图所示:
SwitchListTile
- 一种切换按钮,可以快速切换状态,试举一例:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { final GlobalKey<PopupMenuButtonState<int>> _key = GlobalKey(); bool _lights = false; @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Menu'), actions: [ PopupMenuButton<int>( key: _key, itemBuilder: (context) { return <PopupMenuEntry<int>>[ PopupMenuItem(child: Text('0'), value: 0), PopupMenuItem(child: Text('1'), value: 1), ]; }, ), ], ), body: Center( child: SwitchListTile( title: const Text('Lights'), value: _lights, onChanged: (bool value) { setState(() { _lights = value; }); }, secondary: const Icon(Icons.lightbulb_outline), ))), ); } }
生成的效果如下图所示:
CheckBox
- 是一种多选按钮,试举例如下:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { final GlobalKey<PopupMenuButtonState<int>> _key = GlobalKey(); bool isChecked = false; @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Menu'), actions: [ PopupMenuButton<int>( key: _key, itemBuilder: (context) { return <PopupMenuEntry<int>>[ PopupMenuItem(child: Text('0'), value: 0), PopupMenuItem(child: Text('1'), value: 1), ]; }, ), ], ), body: Center( child: Checkbox( checkColor: Colors.white, fillColor: MaterialStateProperty.all(Colors.amber), value: isChecked, onChanged: (bool? value) { setState(() { isChecked = value!; }); }, ))), ); } }
生成的效果如下图所示:
还有更多的按钮,可以参看官网的这个分页:
ArrayArrayArray- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号