[Flutter 基础] - App的入口main.dart

737 阅读7分钟

在 Flutter 项目中,main.dart 可以说是最重要的一部分,文件是应用程序的入口文件,所有的 Flutter 应用程序都从 main() 函数开始执行。对于一个初学者来说,这个文件很陌生的,也不清楚这个文件到底是可以做些什么,以及一些字段的作用是什么,所以整体初步的了解一下这个文件还是很有必要的。以下是关于 main.dart 文件及其内容的详细解析。


一、main.dart 的基本结构

一个标准的 main.dart 文件通常包含以下内容:

  1. import 导入语句
    • 导入 Flutter 框架的核心库和其他必要的包。
  2. void main() 入口函数
    • 程序的起点,调用 runApp() 方法启动应用。
  3. MaterialAppCupertinoApp
    • 定义应用的主题和路由配置。
  4. Scaffold 和页面组件
    • 构建应用的主界面(如导航栏、主体内容等)。

二、代码示例

想通过一个常见的简单配置示例来初步了解一下这个文件的内容:

import 'package:flutter/material.dart'; // 导入核心 Material 组件库

// 主函数,Flutter 应用的入口点
void main() {
  runApp(MyApp());
}

// 自定义组件 MyApp,继承自 StatelessWidget
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo', // 应用名称
      initialRoute: '/', //默认路由路径
      routes: { //路由管理模块列表
        '/': (context) => MyApp(), 
        '/second': (context) => SecondPage(), 
      },
      localizationsDelegates: [ //国际化
        GlobalMaterialLocalizations.delegate, // Material 组件的本地化
        GlobalWidgetsLocalizations.delegate, // 基础组件的本地化
        GlobalCupertinoLocalizations.delegate, // Cupertino 组件的本地化
      ],
      supportedLocales: [
        Locale('en', 'US'), // 英语
        Locale('zh', 'CN'), // 中文
      ],
      theme: ThemeData(
        primarySwatch: Colors.blue, // 设置主题颜色
      ),
      home: MyHomePage(title: 'Flutter Home Page'), // 主页面
    );
  }
}

// 主页面组件,继承自 StatefulWidget
class MyHomePage extends StatefulWidget {
  final String title;

  // 构造函数,接收标题参数
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

// 主页面的状态管理类
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0; // 状态变量

  // 增加计数器的方法
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 页面顶部显示标题
      ),
      body: Center( //将所有的子元素居中展示
        child: Column( //子元素按列表展示
          mainAxisAlignment: MainAxisAlignment.center, //主轴居中对齐,列表的主轴是上下方向,也就是上下居中
          children: <Widget>[
            Text( // 展示一个文本
              'You have pushed the button this many times:',
            ),
            Text(  // 展示一个文本
              '$_counter', //文本的动态内容,展示_counter字段的值
              style: Theme.of(context).textTheme.headline4, // 使用主题样式
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton( // 浮动按钮
        onPressed: _incrementCounter, // 点击事件
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }
}

三、详细解析

1. import 导入语句

  • 作用:引入 Flutter 框架的核心库或其他依赖包。
  • 示例
    import 'package:flutter/material.dart';
    
    • material.dart:提供 Material Design 风格的 UI 组件。
    • 如果需要 Cupertino 风格(iOS 风格),可以导入 cupertino.dart

2. void main() 入口函数

  • 作用:Flutter 应用的入口点,所有程序从此处开始运行。

  • 语法

    void main() {
      runApp(Widget app);
    }
    
    • runApp() 是 Flutter 框架的核心方法,用于启动应用。
    • 参数 app 是一个 Widget,通常是 MaterialAppCupertinoApp。如果使用GetX作为状态管理,这里就是GetMaterialApp

3. MaterialApp

​ Material风格是Android常用的一种设计风格,IOS中常用的是Cupertino设计风格。在扩展部分会介绍一下Material所支持的所有参数。这里先介绍一下基础学习的常用属性。

  • 作用:定义 Material Design 风格的应用配置。
  • 常用属性
    • title:应用名称(App的名称,仅在任务管理器或桌面模式下显示)。
    • theme:全局主题配置(如颜色、字体等)。
    • home:应用的主页面。
    • routes:定义应用的路由表。
    • initialRoute:初始路由路径。
    • debugShowCheckedModeBanner:是否显示右上角的调试横幅(默认为 true)。
  • 示例
    MaterialApp(
      title: 'Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.purple,
        fontFamily: 'Roboto',
      ),
      home: MyHomePage(),
    );
    

4. Scaffold

  • 作用:提供 Material Design 页面的基本结构。
  • 常用属性
    • appBar:顶部导航栏。
    • body:页面主体内容。
    • floatingActionButton:浮动按钮。
    • drawer:侧边菜单。
    • bottomNavigationBar:底部导航栏。
  • 示例
    Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(child: Text('Hello World')),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: Icon(Icons.add),
      ),
    );
    

5. StatefulWidgetStatelessWidget

Flutter中的最基础的2个widget。

  • StatelessWidget
    • 无状态组件,UI 不会随数据变化而更新。
    • 示例:主要用于数据不会更新的页面,比如:隐私条款,提示说明,等只有静态文本、图片等的页面。
  • StatefulWidget
    • 有状态组件,可通过 setState() 更新 UI。
    • 示例:大部分功能开发都是使用这个widget,尤其是涉及到接口数据,用户交互等页面。如:计数器、输入框等。
  • 区别
    • StatelessWidget 只有一个 build 方法。
    • StatefulWidget 包含两个部分:组件本身和状态管理类。

6. _MyHomePageState 中的状态管理

  • 状态变量

    • _counter:保存当前计数值。
  • 更新方法

    • _incrementCounter():通过 setState() 修改状态并触发 UI 更新。
  • 示例

    void _incrementCounter() {
      setState(() {
        _counter++;
      });
    }
    

四、扩展部分

MaterialApp 的所有参数

MaterialApp 是 Flutter 中用于构建遵循 Material Design 规范的应用程序的根组件。它提供了许多参数来配置应用程序的主题、路由、导航栏等。以下是 MaterialApp 的所有主要参数及其解析:

1. 基本参数
  • title: 应用程序的名称,显示在设备的任务管理器中。
  • initialRoute: 应用启动时的第一个路由(页面)。如果未指定,则默认为 '/'
2. 主题相关
  • theme: 定义应用的亮色主题(Light Theme),通过 ThemeData 类设置颜色、字体等样式。
  • darkTheme: 定义应用的暗色主题(Dark Theme)。当系统或用户选择暗模式时使用。
  • themeMode: 控制使用哪种主题模式(亮色、暗色或根据系统设置自动切换)。可选值有 ThemeMode.light, ThemeMode.dark, ThemeMode.system
3. 本地化支持
  • localizationsDelegates: 提供应用程序所需的本地化委托。通常包括 GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate 等。
  • supportedLocales: 列出应用程序支持的所有语言环境(Locale)。
  • locale: 设置应用程序的当前语言环境。如果不提供,默认使用设备的语言环境。
  • localeResolutionCallback: 当Flutter无法确定哪个语言环境最适合用户的首选项时调用的回调函数。
4. 路由和导航
  • home: 应用程序的主界面,通常是 Widget 类型的一个实例。若指定了 routes,则此属性不是必需的。
  • routes: 应用程序的顶级路由表,是一个从字符串到 WidgetBuilder 的映射。
  • onGenerateRoute: 当没有匹配的命名路由时调用的回调函数,可用于动态生成路由。
  • onUnknownRoute: 当无法找到目标路由时调用的回调函数。
  • navigatorKey: 可选的全局键,用于获取 NavigatorState 实例。
  • navigatorObservers: 一个 NavigatorObserver 对象列表,可以用来监听导航事件。
5. 其他UI定制
  • builder: 在返回给定的 child 前,允许对 Widget 树进行修改的函数。
  • debugShowCheckedModeBanner: 是否显示右上角的调试横幅(仅在 debug 模式下有效)。
  • showPerformanceOverlay: 是否在屏幕上显示性能覆盖层,以帮助开发者了解应用的性能情况。
  • checkerboardOffscreenLayerscheckerboardRasterCacheImages: 这些选项有助于检测渲染问题。
  • scaffoldMessengerKey: 全局键,用于访问 ScaffoldMessengerState,方便显示 Snackbar 或底部弹窗等。
6. 初始化与错误处理
  • onGenerateInitialRoutes: 用于自定义初始路由的生成逻辑。
  • onError: 处理 Flutter 框架抛出的未捕获异常的回调。

这些参数提供了灵活的方式来配置和定制你的 Flutter 应用,使其能够更好地适应不同的需求和场景。例如,通过配置 themedarkTheme 来确保应用在不同环境下都有良好的视觉体验;或者通过 routesonGenerateRoute 来实现复杂的导航逻辑。


五、总结

main.dart 是 Flutter 应用的核心文件,其主要内容包括:

  1. main() 函数:程序入口。
  2. MaterialApp:定义应用的全局配置。
  3. Scaffold:构建页面的基本结构。
  4. 状态管理:通过 StatefulWidget 实现动态 UI。

main.dart是flutter项目的一个核心文件,通过灵活使用这些基础组件和配置,可以快速搭建出功能完善的 Flutter 应用。但作为初学者前期很难深入去了解每一个属性。因此做个初步的了解和认识就好了。后期对flutter有了一个整体认识,并且能做一些简单的App的时候,可以再回头针对这部分内容做个深入的研究。比如路由管理,状态管理等。