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