網站首頁 編程語言 正文
Flutter
Flutter是谷歌的移動UI框架,可以在IOS和Android上快速構建高質量的本地用戶界面。Flutter可以使用現有代碼。
在世界上,Flutter正被越來越多的開發人員和組織使用,Flutter是完全免費和開源的。這也是構建未來Google Fuchsia應用程序的主要方式。
import 'package:flutter/material.dart';
void main() {
runApp(
new Center(
child: new Text(
'Hello, world!',
textDirection: TextDirection.ltr,
),
),
);
}
runApp函數接受給定的小部件,并使其成為小部件樹的根。在本例中,小部件樹由兩個小部件組成:Center(及其子小部件)和Text。框架強制根小部件覆蓋整個屏幕,這意味著文本“Hello,world”將位于屏幕中心。需要在text實例中指定文本顯示的方向。使用MaterialApp時,將自動設置文本方向,稍后將進行演示。 編寫應用程序時,通常會創建新的小部件。這些小部件是無狀態無狀態小部件或有狀態有狀態小部件。具體選擇取決于小部件是否需要管理某些狀態。小部件的主要工作是實現一個構建函數來構建自己。小部件通常由一些較低級別的小部件組成。Flutter框架將依次構建這些小部件,直到構建最低級別的子小部件。這些最低級別的小部件通常是RenderObject,它將計算和描述小部件的幾何結構。
Material
Flutter提供了許多小部件來幫助構建遵循Material Design的應用程序。Material應用程序從MaterialApp小部件開始,它在應用程序的根位置創建一些有用的小部件,包括一個Navigator,它管理由字符串標識的小部件堆棧(即頁面路由堆棧)。導航器允許應用程序在頁面之間平滑過渡。是否使用MaterialApp是完全可選的,但使用它是一個很好的做法。 Scaffold是Material中主要的布局組件.
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: 'Flutter Tutorial',
home: new TutorialHome(),
));
}
class TutorialHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
leading: new IconButton(
icon: new Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null,
),
title: new Text('Example title'),
actions: <Widget>[
new IconButton(
icon: new Icon(Icons.search),
tooltip: 'Search',
onPressed: null,
),
],
),
body: new Center(
child: new Text('Hello, world!'),
),
floatingActionButton: new FloatingActionButton(
tooltip: 'Add', // used by assistive technologies
child: new Icon(Icons.add),
onPressed: null,
),
);
}
}
更完整的示例
讓我們考慮一個更完整的示例,它將上面介紹的概念結合在一起。讓我們假設一個顯示各種待售產品并維護購物車的購物應用程序。讓我們先定義ShoppingListItem:
class Product {
const Product({this.name});
final String name;
}
typedef void CartChangedCallback(Product product, bool inCart);
class ShoppingListItem extends StatelessWidget {
ShoppingListItem({Product product, this.inCart, this.onCartChanged})
: product = product,
super(key: new ObjectKey(product));
final Product product;
final bool inCart;
final CartChangedCallback onCartChanged;
Color _getColor(BuildContext context) {
return inCart ? Colors.black54 : Theme.of(context).primaryColor;
}
TextStyle _getTextStyle(BuildContext context) {
if (!inCart) return null;
return new TextStyle(
color: Colors.black54,
decoration: TextDecoration.lineThrough,
);
}
@override
Widget build(BuildContext context) {
return new ListTile(
onTap: () {
onCartChanged(product, !inCart);
},
leading: new CircleAvatar(
backgroundColor: _getColor(context),
child: new Text(product.name[0]),
),
title: new Text(product.name, style: _getTextStyle(context)),
);
}
}
ShoppingListItem小部件是無狀態的。它將在構造函數中接收的值存儲在最終成員變量中,然后在構建函數中使用它們。例如,inCart布爾值表示在兩種視覺呈現效果之間切換:一種使用當前主題的主色,另一種使用灰色。 當用戶單擊列表項時,小部件不會直接修改其inCart值。相反,小部件將調用其父小部件賦予它的onCartChanged回調函數。此模式允許在小部件層次結構中存儲更高的狀態,從而使狀態持續更長時間。在極端情況下,存儲并傳遞給runApp應用程序的小部件的狀態將持續整個生命周期。 當父項收到onCartChanged回調時,父項將更新其內部狀態,這將觸發父項使用新的inCart值重新生成ShoppingListItem的新實例。盡管父ShoppingListItem在重建時創建了一個新實例,但操作成本很低,因為Flutter框架會將新構建的小部件與先前構建的小組件進行比較,并且只將差異應用于底層RenderObject。
Key
可以使用該鍵控制在重新構建小部件時框架將匹配哪些其他小部件。默認情況下,框架根據其runtimeType和顯示順序進行匹配。當使用鍵時,框架要求兩個小部件具有相同的鍵和runtimeType。 鍵對于構建相同類型的小部件的多個實例非常有用。例如,ShoppingList構建了足夠的ShoppingListItem實例來填充其可見區域: 如果沒有密鑰,則當前生成中的第一個項將始終與上一個生成中的首個項同步。即使在語義上,如果列表中的第一個項目滾動到屏幕外,它在窗口中也不再可見。 通過將列表中的每個項目指定為“語義”鍵,無限列表可以更有效,因為框架將使項目與匹配的語義鍵同步,從而具有相似(或相同)的視覺外觀。此外,語義同步條目意味著在有狀態的子窗口小部件中,保留狀態將附加到相同的語義條目,而不是附加到相同編號位置的條目。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget titleSection = new Container(
padding: const EdgeInsets.all(32.0),
child: new Row(
children: [
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
new Container(
padding: const EdgeInsets.only(bottom: 8.0),
child: new Text(
'Oeschinen Lake Campground',
style: new TextStyle(
fontWeight: FontWeight.bold,
),
),
),
new Text(
'Kandersteg, Switzerland',
style: new TextStyle(
color: Colors.grey[500],
),
),
],
),
),
new Icon(
Icons.star,
color: Colors.red[500],
),
new Text('41'),
],
),
);
//...
}
將第一行文本放入容器,然后在底部添加8個像素。列中的第二個子項(也是文本)顯示為灰色。 標題行中的最后兩項是紅星圖標和文本“41”。將整行放在容器中,沿每條邊填充32個像素
原文鏈接:https://juejin.cn/post/7178507074089779237
相關推薦
- 2022-02-20 Spring Boot 打包報錯Failed to execute goal org.apache.
- 2022-11-28 Kotlin的Collection與Sequence操作異同點詳解_Android
- 2022-12-04 Flask帶參URL傳值的實現方法_python
- 2022-05-06 SQL查看表字段信息如:字段名、字段類型、字段精度、字段大小、索引、主鍵等
- 2022-06-22 Github創建個人訪問Tokens令牌_其它綜合
- 2021-12-12 C/C++?Qt?數據庫QSql增刪改查組件應用教程_C 語言
- 2023-06-20 在VScode里面添加Python解釋器的詳細步驟_python
- 2023-02-01 C#模擬實現QQ窗體功能_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支