一、 繼承StatelessWidget組件
import 'package:flutter/material.dart';
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //TODO:implementbuild return Center( child: Text( "My name is maple", textDirection: TextDirection.ltr, ), ); } }
二、Text組件
import 'package:flutter/material.dart';
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //TODO:implementbuild return Center( child: Text( "My name is maple", textDirection: TextDirection.ltr, style: TextStyle( fontSize: 40.0, //字體大小 fontWeight: FontWeight.bold, //字體粗細 color: Colors.yellow //字體顏色 ), ), ); } }
三、MaterialApp頂層組件
import 'package:flutter/material.dart';
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { final routes = { '/': (BuildContext context) => new Home(), }; @override Widget build(BuildContext context) { //TODO:implementbuild return MaterialApp( title: "標題", //主題 theme: ThemeData(primarySwatch: Colors.red, brightness: Brightness.light), // 主頁 // home: Home(), // 路由 routes: routes); } } class Home extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return Center( child: Text( "My name is maple", textDirection: TextDirection.ltr, style: TextStyle( fontSize: 30.0, //字體大小 fontWeight: FontWeight.bold, //字體粗細 color: Colors.yellow //字體顏色 ), ), ); } }
四、Text,Container 組件
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //TODO:implementbuild return MaterialApp( title: "標題", //主題 theme: ThemeData(primarySwatch: Colors.red, brightness: Brightness.light), // 主頁 home: Scaffold( appBar: AppBar( title: Text('Flutter'), elevation: 30.0, ), body: Home()), //設置標題陰影 不需要的話值設置成 0.0 ); } } class Home extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return Center( // Container類似於css的div child: Container( child: Text( "My name is maple and I like to eat", textAlign: TextAlign.center, //文本對齊方式 overflow: TextOverflow.ellipsis, //文字超出屏幕之后的處理方式(clip 裁剪,fade 漸隱,ellipsis 省略號) textScaleFactor: 1.5, //字體顯示倍率 textDirection: TextDirection.ltr, //文本方向(ltr 從左至右,rtl 從右至 左) maxLines: 2, //文字顯示最大行數 style: TextStyle( fontSize: 25.0, //字體大小 fontWeight: FontWeight.bold, //字體粗細 color: Colors.red, //字體顏色 fontStyle: FontStyle.italic, //文字樣式(italic 斜體,normal 正常體) ), ), //topCenter:頂部居中對齊 // topLeft:頂部左對齊 // topRight:頂部右對齊 // center:水平垂直居中對齊 // centerLeft:垂直居中水平居左對齊 // centerRight:垂直居中水平居右對齊 // bottomCenter 底部居中對齊 // bottomLeft:底部居左對齊 // bottomRight:底部居右對齊 alignment: Alignment.topLeft, height: 300.0, width: 300.0, // 類似於css的盒模型 decoration: BoxDecoration( color: Colors.yellow, border: Border.all(color: Colors.blue, width: 2.0), //邊框 borderRadius: BorderRadius.all( // Radius.circular(150), //圓形 Radius.circular(10), //圓角 ), ), // padding 就是 Container 的內邊距,指 Container 邊緣與 Child 之間的距離 // padding:EdgeInsets.all(20), padding: EdgeInsets.fromLTRB(10, 30, 5, 0), // margin 屬性是表示 Container 與外部其他 組件的距離 margin: EdgeInsets.fromLTRB(10, 30, 5, 0), // 讓 Container 容易進行一些旋轉之類的 // transform: Matrix4.translationValues(100, 0, 0) transform: Matrix4.rotationZ(0.3) // transform: Matrix4.diagonal3Values(1.2, 1, 1) ), ); } }
五、Image組件
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return Center( child: Container( // 加載本地文件 child: Image.asset( 'images/p2620309098.jpg', // fit 屬性用來控制圖片的拉伸和擠壓,這都是根據父容器來 的。 // BoxFit.fill:全圖顯示,圖片會被拉伸,並充滿父容器。 // BoxFit.contain:全圖顯示,顯示原比例,可能會有空隙。 // BoxFit.cover:顯示可能拉伸,可能裁切,充滿(圖片要 充滿整個容器,還不變形)。 fit: BoxFit.cover, // 設置圖片的背景顏色,通常和 colorBlendMode 配合一起 使用, // 這樣可以是圖片顏色和背景色混合。 // 上面的圖片就 是進行了顏色的混合,綠色背景和圖片紅色的混合 color: Colors.red, colorBlendMode: BlendMode.colorDodge, ), height: 400, width: 400, decoration: BoxDecoration(color: Colors.yellow), )); } }
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return Center( //如果 child 為正方形時剪裁之后是圓形,如果 child 為矩形時,剪裁之后為橢圓形。 child: ClipOval( child: Container( // 加載網絡文件 child: Image.network( 'https://img1.doubanio.com/view/photo/l/public/p2578828978.webp', // fit 屬性用來控制圖片的拉伸和擠壓,這都是根據父容器來 的。 // BoxFit.fill:全圖顯示,圖片會被拉伸,並充滿父容器。 // BoxFit.contain:全圖顯示,顯示原比例,可能會有空隙。 // BoxFit.cover:顯示可能拉伸,可能裁切,充滿(圖片要 充滿整個容器,還不變形)。 fit: BoxFit.cover, // 設置圖片的背景顏色,通常和 colorBlendMode 配合一起 使用, // 這樣可以是圖片顏色和背景色混合。 // 上面的圖片就 是進行了顏色的混合,綠色背景和圖片紅色的混合 color: Colors.red, colorBlendMode: BlendMode.colorDodge, ), height: 400, width: 400, decoration: BoxDecoration(color: Colors.yellow), ), ), ); } }
六、ListView列表組件
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return ListView( padding: EdgeInsets.all(10), children: <Widget>[ Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img1.doubanio.com/view/photo/m/public/p2620309098.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img1.doubanio.com/view/photo/m/public/p2578828978.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img1.doubanio.com/view/photo/m/public/p2621748239.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img9.doubanio.com/view/photo/m/public/p2627557925.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img9.doubanio.com/view/photo/m/public/p2624006816.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Container( child: Text( '曼達洛人二', textAlign: TextAlign.center, style: TextStyle( fontSize: 28, ), ), height: 60, padding: EdgeInsets.fromLTRB(0, 10, 0, 10), ), Image.network( "https://img2.doubanio.com/view/photo/m/public/p2627320552.webp"), ], ); } }
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return Container( height: 180, padding: EdgeInsets.fromLTRB(5, 0, 5, 0), child: ListView( scrollDirection: Axis.horizontal, children: <Widget>[ Container( width: 250.0, color: Colors.red, child: ListView( children: <Widget>[ Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Text('曼達洛人') ], ), ), Container( width: 250.0, color: Colors.orange, child: ListView( children: <Widget>[ Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Text('曼達洛人') ], ), ), Container( width: 250.0, color: Colors.blue, child: ListView( children: <Widget>[ Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Text('曼達洛人') ], ), ), Container( width: 250.0, color: Colors.deepOrange, child: ListView( children: <Widget>[ Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Text('曼達洛人') ], ), ), Container( width: 250.0, color: Colors.deepPurpleAccent, child: ListView( children: <Widget>[ Image.network( "https://img3.doubanio.com/view/photo/m/public/p2623776231.webp"), Text('曼達洛人') ], ), ), ], ), ); } }
七、動態ListView組件
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { List httpList = [ 'https://img2.doubanio.com/view/photo/m/public/p2622724983.webp', 'https://img2.doubanio.com/view/photo/m/public/p2622724983.webp', 'https://img2.doubanio.com/view/photo/m/public/p2622724983.webp', 'https://img2.doubanio.com/view/photo/m/public/p2622724983.webp' ]; //自定義方法 List<Widget> _getData() { List<Widget> list = new List(); httpList.forEach((http) { list.add(Container( height: 300, child: Image.network("$http"), )); }); return list; } @override Widget build(BuildContext context) { // TODO: implement build return ListView( children: this._getData(), ); } }
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { List listData = [ { "title": '曼達洛人第1集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第2集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第3集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第4集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第5集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第6集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, ]; //自定義方法 List<Widget> _getListData() { var tempList = listData.map((value) { return Container( // 分割線 decoration: BoxDecoration( color: Colors.white, border: Border(bottom: BorderSide(width: 1, color: Colors.black12))), child: ListTile( leading: CircleAvatar(backgroundImage: NetworkImage(value["imageUrl"])), title: Text(value["title"]), subtitle: Text(value["type"])), ); }); return tempList.toList(); } @override Widget build(BuildContext context) { // TODO: implement build return ListView( children: this._getListData(), ); } }
八、GridView組件(網格視圖)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Flutter')), body: HomeContent(), )); } } class HomeContent extends StatelessWidget { List listData = [ { "title": '曼達洛人第1集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第2集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第3集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第4集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第5集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, { "title": '曼達洛人第6集', "type": '科幻', "imageUrl": 'https://img1.doubanio.com/view/photo/m/public/p2578828978.webp', }, ]; List<Widget> _getListData() { var tempList = listData.map((value) { return Container( child: Column( children: <Widget>[ Image.network(value['imageUrl']), SizedBox(height: 10), Text( value['title'], textAlign: TextAlign.center, style: TextStyle(fontSize: 18), ) ], ), decoration: BoxDecoration( borderRadius: const BorderRadius.all(const Radius.circular(8.0)), //外圓角 border: Border.all( color: Color.fromRGBO(111, 111, 111, 0.9), width: 2)), // height: 400, //設置高度沒有反應 ); }); return tempList.toList(); } @override Widget build(BuildContext context) { return GridView.count( //水平子 Widget 之間間距 crossAxisSpacing: 10.0, //垂直子 Widget 之間間距 mainAxisSpacing: 10.0, //一行的 Widget 數量 padding: EdgeInsets.symmetric(horizontal:16), crossAxisCount: 2, //寬度和高度的比例 childAspectRatio: 0.63, children: this._getListData(), ); } }