Flutter基础Widget #
一、Container #
1.1 基本用法 #
Container是最常用的容器Widget,可以设置大小、边距、背景等属性。
dart
Container({
Key? key,
AlignmentGeometry? alignment,
EdgeInsetsGeometry? padding,
Color? color,
Decoration? decoration,
Decoration? foregroundDecoration,
double? width,
double? height,
BoxConstraints? constraints,
EdgeInsetsGeometry? margin,
Matrix4? transform,
AlignmentGeometry? transformAlignment,
Widget? child,
Clip? clipBehavior,
})
1.2 常用属性 #
dart
Container(
width: 200,
height: 100,
padding: EdgeInsets.all(16),
margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black26,
blurRadius: 10,
offset: Offset(0, 4),
),
],
),
child: Center(
child: Text('Container'),
),
)
1.3 装饰效果 #
dart
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.purple],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Colors.white,
width: 2,
),
),
)
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage('https://example.com/image.jpg'),
fit: BoxFit.cover,
),
),
)
二、Scaffold #
2.1 基本用法 #
Scaffold是Material Design风格的页面脚手架,提供了完整的页面结构。
dart
Scaffold({
Key? key,
PreferredSizeWidget? appBar,
Widget? body,
Widget? floatingActionButton,
FloatingActionButtonLocation? floatingActionButtonLocation,
FloatingActionButtonAnimator? floatingActionButtonAnimator,
List<Widget>? persistentFooterButtons,
Widget? drawer,
Widget? endDrawer,
Widget? bottomNavigationBar,
Widget? bottomSheet,
Color? backgroundColor,
bool? resizeToAvoidBottomInset,
bool primary = true,
bool extendBody = false,
bool extendBodyBehindAppBar = false,
})
2.2 完整示例 #
dart
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
actions: [
IconButton(
icon: Icon(Icons.settings),
onPressed: () {},
),
],
),
drawer: Drawer(
child: ListView(
children: [
DrawerHeader(
child: Text('Menu'),
),
ListTile(
title: Text('Item 1'),
onTap: () {},
),
],
),
),
body: Center(
child: Text('Hello, Flutter!'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
),
],
),
);
}
}
三、AppBar #
3.1 基本用法 #
AppBar是Material Design风格的顶部导航栏。
dart
AppBar({
Key? key,
Widget? leading,
bool automaticallyImplyLeading = true,
Widget? title,
List<Widget>? actions,
Widget? flexibleSpace,
PreferredSizeWidget? bottom,
double? elevation,
Color? shadowColor,
ShapeBorder? shape,
Color? backgroundColor,
Color? foregroundColor,
Brightness? systemOverlayStyle,
bool primary = true,
bool? centerTitle,
bool excludeHeaderSemantics = false,
double? titleSpacing,
double toolbarOpacity = 1.0,
double bottomOpacity = 1.0,
double? toolbarHeight,
double? leadingWidth,
TextStyle? toolbarTextStyle,
TextStyle? titleTextStyle,
SystemUiOverlayStyle? systemOverlayStyle,
})
3.2 常用配置 #
dart
AppBar(
leading: IconButton(
icon: Icon(Icons.menu),
onPressed: () {},
),
title: Text('My App'),
centerTitle: true,
actions: [
IconButton(
icon: Icon(Icons.search),
onPressed: () {},
),
IconButton(
icon: Icon(Icons.more_vert),
onPressed: () {},
),
],
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.purple],
),
),
),
bottom: TabBar(
tabs: [
Tab(text: 'Tab 1'),
Tab(text: 'Tab 2'),
],
),
)
3.3 SliverAppBar #
dart
CustomScrollView(
slivers: [
SliverAppBar(
expandedHeight: 200,
floating: false,
pinned: true,
flexibleSpace: FlexibleSpaceBar(
title: Text('Sliver AppBar'),
background: Image.network(
'https://example.com/image.jpg',
fit: BoxFit.cover,
),
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(title: Text('Item $index')),
childCount: 20,
),
),
],
)
四、MaterialApp #
4.1 基本用法 #
MaterialApp是Material Design风格的应用根Widget。
dart
MaterialApp({
Key? key,
GlobalKey<NavigatorState>? navigatorKey,
GlobalKey<ScaffoldMessengerState>? scaffoldMessengerKey,
Widget? home,
Map<String, Widget Function(BuildContext)> routes = const {},
String? initialRoute,
RouteFactory? onGenerateRoute,
RouteFactory? onUnknownRoute,
List<NavigatorObserver> navigatorObservers = const [],
TransitionBuilder? builder,
String title = '',
GenerateAppTitle? onGenerateTitle,
Color? color,
ThemeData? theme,
ThemeData? darkTheme,
ThemeData? highContrastTheme,
ThemeData? highContrastDarkTheme,
ThemeMode? themeMode,
Locale? locale,
Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates,
LocaleListResolutionCallback? localeListResolutionCallback,
LocaleResolutionCallback? localeResolutionCallback,
Iterable<Locale> supportedLocales = const [Locale('en')],
bool debugShowMaterialGrid = false,
bool showPerformanceOverlay = false,
bool checkerboardRasterCacheImages = false,
bool checkerboardOffscreenLayers = false,
bool showSemanticsDebugger = false,
bool debugShowCheckedModeBanner = true,
Map<ShortcutActivator, Intent>? shortcuts,
Map<Type, Action<Intent>>? actions,
String? restorationScopeId,
ScrollBehavior? scrollBehavior,
})
4.2 完整配置 #
dart
MaterialApp(
title: 'My App',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
appBarTheme: AppBarTheme(
centerTitle: true,
elevation: 0,
),
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.dark,
),
),
themeMode: ThemeMode.system,
home: HomePage(),
routes: {
'/home': (context) => HomePage(),
'/settings': (context) => SettingsPage(),
},
onGenerateRoute: (settings) {
switch (settings.name) {
case '/detail':
return MaterialPageRoute(
builder: (context) => DetailPage(id: settings.arguments as String),
);
}
return null;
},
)
五、CupertinoApp #
5.1 基本用法 #
CupertinoApp是iOS风格的 应用根Widget。
dart
CupertinoApp({
Key? key,
GlobalKey<NavigatorState>? navigatorKey,
Widget? home,
Map<String, Widget Function(BuildContext)> routes = const {},
String? initialRoute,
RouteFactory? onGenerateRoute,
RouteFactory? onUnknownRoute,
List<NavigatorObserver> navigatorObservers = const [],
TransitionBuilder? builder,
String title = '',
GenerateAppTitle? onGenerateTitle,
Color? color,
CupertinoThemeData? theme,
Locale? locale,
Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates,
LocaleListResolutionCallback? localeListResolutionCallback,
LocaleResolutionCallback? localeResolutionCallback,
Iterable<Locale> supportedLocales = const [Locale('en')],
bool debugShowCheckedModeBanner = true,
Map<ShortcutActivator, Intent>? shortcuts,
Map<Type, Action<Intent>>? actions,
String? restorationScopeId,
ScrollBehavior? scrollBehavior,
})
5.2 完整配置 #
dart
CupertinoApp(
theme: CupertinoThemeData(
primaryColor: CupertinoColors.activeBlue,
brightness: Brightness.light,
),
home: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('iOS Style'),
),
child: Center(
child: Text('Hello, Cupertino!'),
),
),
)
六、常用布局Widget #
6.1 Center #
dart
Center(
child: Text('Centered'),
)
6.2 Padding #
dart
Padding(
padding: EdgeInsets.all(16),
child: Text('Padded'),
)
6.3 Align #
dart
Align(
alignment: Alignment.topRight,
child: Text('Aligned'),
)
6.4 SizedBox #
dart
SizedBox(
width: 100,
height: 100,
child: Container(color: Colors.blue),
)
SizedBox(height: 20)
SizedBox.expand(
child: Container(color: Colors.red),
)
6.5 AspectRatio #
dart
AspectRatio(
aspectRatio: 16 / 9,
child: Container(color: Colors.blue),
)
6.6 ConstrainedBox #
dart
ConstrainedBox(
constraints: BoxConstraints(
minWidth: 100,
maxWidth: 200,
minHeight: 50,
maxHeight: 100,
),
child: Container(color: Colors.blue),
)
6.7 LimitedBox #
dart
LimitedBox(
maxWidth: 100,
maxHeight: 100,
child: Container(color: Colors.blue),
)
6.8 FractionallySizedBox #
dart
FractionallySizedBox(
widthFactor: 0.5,
heightFactor: 0.3,
child: Container(color: Colors.blue),
)
七、装饰Widget #
7.1 DecoratedBox #
dart
DecoratedBox(
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8),
),
child: Padding(
padding: EdgeInsets.all(16),
child: Text('Decorated'),
),
)
7.2 ClipRRect #
dart
ClipRRect(
borderRadius: BorderRadius.circular(16),
child: Image.network('https://example.com/image.jpg'),
)
7.3 Opacity #
dart
Opacity(
opacity: 0.5,
child: Container(color: Colors.blue),
)
7.4 Transform #
dart
Transform.rotate(
angle: 0.1,
child: Container(color: Colors.blue),
)
Transform.scale(
scale: 1.5,
child: Container(color: Colors.blue),
)
Transform.translate(
offset: Offset(10, 10),
child: Container(color: Colors.blue),
)
八、总结 #
8.1 核心Widget #
| Widget | 说明 |
|---|---|
| Container | 通用容器 |
| Scaffold | 页面脚手架 |
| AppBar | 顶部导航栏 |
| MaterialApp | Material应用 |
| CupertinoApp | iOS风格应用 |
8.2 下一步 #
掌握了基础Widget后,让我们学习 文本与样式!
最后更新:2026-03-28