翼度科技»论坛 编程开发 html5 查看内容

Flutter系列文章-Flutter基础

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
Flutter是Google推出的一种新的移动应用开发框架,允许开发者使用一套代码库同时开发Android和iOS应用。它的设计理念、框架结构、以及对Widget的使用,都让开发者能更有效率地创建高质量的应用。
一、Flutter设计理念

Flutter的设计理念是“一切皆为Widget”。这意味着不论是按钮、字体、颜色、布局,甚至是你的整个应用程序,都是由一个个Widget组合而成。在Flutter中,Widget可以嵌套、包裹或组合在一起,形成复杂的UI组件,这给了开发者极大的灵活性和创造力。
二、Flutter框架结构


Flutter框架由一系列层次结构构成。自底向上,主要包括:

  • Dart平台:Flutter使用Dart语言编写,Dart平台包括一个能够为Flutter生成原生ARM代码的Dart JIT和AOT编译器。
  • Flutter引擎:主要用C++编写,它提供了低级渲染支持。它还负责插件系统、文本布局和类型设置、网络和文件 I/O、线程管理等。
  • Foundation库:提供了和Dart一致的基本类型和实用工具,使得其他更高级别的库可以共享相同的设计和实现。
  • Widgets:描述应用程序用户界面和交互的模块。关键概念包括Widget、StatelessWidget、StatefulWidget、State等。
三、Flutter中的Widget

Flutter中的Widget即是声明UI的视图,也是视图和界面变化的桥梁。一个Widget可以定义:
一个结构元素(如按钮或菜单)
一个样式元素(如字体或颜色模式)
甚至是布局方面的元素(如填充或对齐方式)
在Flutter中,Widget的主要任务是提供一个build()方法,用于描述在UI中所看到的内容。
四、StatelessWidget和StatefulWidget

StatelessWidget是不可变的。它们描述了在给定配置下应该如何构建UI。而StatefulWidget则可以在生命周期内改变状态。实现一个StatefulWidget至少需要两个类:1)一个StatefulWidget类;2)一个State类。
五、基础布局Widgets

在Flutter中有很多布局Widget,比如Row,Column和Stack等。Row和Column是基本布局Widget,它们都接受一列子Widget,并在水平或垂直方向上排列。Stack可以将Widget堆叠在一起,实现各种复杂的布局。
六、Flutter程序结构

一个基本的Flutter程序通常包括以下部分:

  • main函数:应用的入口点。
  • MyApp类:StatelessWidget,返回一个包含应用主题、路由和主页的MaterialApp Widget。
  • 主页类:可为StatelessWidget或StatefulWidget,包含应用主体部分。
  • 其他Widget类:你自定义的Widget,可被主页类或其他Widget类使用。
    掌握了这些基础知识,你就能更好地使用Flutter框架进行应用开发,创建出精美并具有良好用户体验的应用程序。
七、Flutter的Widget

7.1. 基础Widgets

在Flutter中,所有的界面元素都是由Widget构建的。每一个Widget都描述了界面上应该看到什么。你可以把Widget看作是应用界面的一个构建块。它们包括用于显示文字、图片、图标、输入框以及行为等的元素。
7.1.1 Text:这个widget用于显示简单的样式文本,它包含一些控制文本显示样式的属性。####
  1. Text(
  2.   'Hello, World!',
  3.   textAlign: TextAlign.center,
  4.   style: TextStyle(fontWeight: FontWeight.bold),
  5. )
复制代码
7.1.2 Image:用于显示图片的widget,支持多种方式的图片加载,例如网络、资源、文件系统等。
  1. Image.network('https://example.com/images/sample.jpg')
复制代码
7.1.3 Icon:Material Design的图标widget。
  1. Icon(Icons.star, color: Colors.red[500])
复制代码
7.2. Widget类型:StatelessWidget和StatefulWidget。

7.2.1. StatelessWidget

StatelessWidget是不可变的,它描述了在给定配置下应该如何构建UI。例如,下面的代码展示了如何创建一个自定义的StatelessWidget,它返回一个红色的星星图标:
  1. class MyIcon extends StatelessWidget {
  2.   @override
  3.   Widget build(BuildContext context) {
  4.     return Icon(Icons.star, color: Colors.red[500]);
  5.   }
  6. }
复制代码
7.2.2. StatefulWidget

StatefulWidget是动态的。它们可以在生命周期内改变状态,例如响应用户的交互。一个StatefulWidget至少需要两个类:StatefulWidget类和State类。以下是一个例子:
  1. class Counter extends StatefulWidget {
  2.   Counter({Key key, this.title}) : super(key: key);
  3.   final String title;
  4.   @override
  5.   _CounterState createState() => _CounterState();
  6. }
  7. class _CounterState extends State<Counter> {
  8.   int _counter = 0;
  9.   void _incrementCounter() {
  10.     setState(() {
  11.       _counter++;
  12.     });
  13.   }
  14.   @override
  15.   Widget build(BuildContext context) {
  16.     return Column(
  17.       children: <Widget>[
  18.         Text('You have pushed the button $_counter times.'),
  19.         RaisedButton(
  20.           onPressed: _incrementCounter,
  21.           child: Text('Increment'),
  22.         ),
  23.       ],
  24.     );
  25.   }
  26. }
复制代码
这个例子创建了一个名为Counter的新StatefulWidget。每当用户按下"Increment"按钮时,_counter 的值就会增加,并且UI会自动更新。
八、Flutter的基本布局Widgets

在Flutter中,我们有许多预定义的布局Widget,例如Row、Column和Stack。
8.1. Row和Column

Row和Column是两个最常用的布局Widget。它们都接受一列子Widget,并在水平或垂直方向上排列。以下是一个使用Row的例子,它包含了三个红色的星星图标:
  1. Row(
  2.   mainAxisAlignment: MainAxisAlignment.spaceAround,
  3.   children: <Widget>[
  4.     Icon(Icons.star, color: Colors.red[500]),
  5.     Icon(Icons.star, color: Colors.red[500]),
  6.     Icon(Icons.star, color: Colors.red[500]),
  7.   ],
  8. )
复制代码
8.2. Stack

Stack是一个布局Widget,它可以将子Widget堆叠在一起。你可以使用Positioned widget来定位Stack中的子Widget。以下是一个简单的Stack示例:
  1. Stack(
  2.   alignment: const Alignment(0.6, 0.6),
  3.   children: [
  4.     CircleAvatar(
  5.       backgroundImage: AssetImage('images/pic.jpg'),
  6.       radius: 100.0,
  7.     ),
  8.     Container(
  9.       decoration: BoxDecoration(
  10.         color: Colors.black45,
  11.       ),
  12.       child: Text(
  13.         'Hello World',
  14.         style: TextStyle(
  15.           fontSize: 20.0,
  16.           fontWeight: FontWeight.bold,
  17.           color: Colors.white,
  18.         ),
  19.       ),
  20.     ),
  21.   ],
  22. )
复制代码
九、下面我们创建一个Flutter的示例应用,包括之前提到的一些关键概念,包括Widget,StatelessWidget,StatefulWidget,以及Row,Column和Stack布局。
  1. import 'package:flutter/material.dart';
  2. void main() {
  3.   runApp(MyApp());
  4. }
  5. class MyApp extends StatelessWidget {
  6.   @override
  7.   Widget build(BuildContext context) {
  8.     return MaterialApp(
  9.       title: 'Flutter Demo',
  10.       theme: ThemeData(
  11.         primarySwatch: Colors.blue,
  12.       ),
  13.       home: MyHomePage(title: 'Flutter Demo Home Page'),
  14.     );
  15.   }
  16. }
  17. class MyHomePage extends StatefulWidget {
  18.   final String title;
  19.   MyHomePage({required this.title, key}) : super(key: key);
  20.   @override
  21.   _MyHomePageState createState() => _MyHomePageState();
  22. }
  23. class _MyHomePageState extends State<MyHomePage> {
  24.   int _counter = 0;
  25.   void _incrementCounter() {
  26.     setState(() {
  27.       _counter++;
  28.     });
  29.   }
  30.   void _decrementCounter() {
  31.     setState(() {
  32.       _counter--;
  33.     });
  34.   }
  35.   @override
  36.   Widget build(BuildContext context) {
  37.     return Scaffold(
  38.       appBar: AppBar(
  39.         title: Text(widget.title),
  40.       ),
  41.       body: Center(
  42.         child: Column(
  43.           mainAxisAlignment: MainAxisAlignment.center,
  44.           children: <Widget>[
  45.             Text(
  46.               'You have pushed the button this many times:',
  47.             ),
  48.             Text(
  49.               '$_counter',
  50.               style: Theme.of(context).textTheme.headline4,
  51.             ),
  52.             Row(
  53.               mainAxisAlignment: MainAxisAlignment.spaceAround,
  54.               children: <Widget>[
  55.                 FloatingActionButton(
  56.                   onPressed: _incrementCounter,
  57.                   tooltip: 'Increment',
  58.                   child: Icon(Icons.add),
  59.                 ),
  60.                 FloatingActionButton(
  61.                   onPressed: _decrementCounter,
  62.                   tooltip: 'Decrement',
  63.                   child: Icon(Icons.remove),
  64.                 ),
  65.               ],
  66.             ),
  67.           ],
  68.         ),
  69.       ),
  70.     );
  71.   }
  72. }
复制代码

通过这篇文章,你应该对Flutter有了一个基础的理解,包括Flutter的设计理念、框架结构、Widget系统、以及如何使用不同类型的Widgets来创建界面和布局。接下来,我们会深入到更高级的主题,包括如何处理用户交互,如何创建动画,以及如何访问网络数据等等。

来源:https://www.cnblogs.com/depeng8899/p/17559946.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具