手记

Flutter语法教程:入门级开发者必读

概述

本文全面介绍了Flutter的基础语法和开发流程,包括Dart语言的基本用法、Flutter组件的使用方法以及布局与样式的设置。此外,文章还涵盖了状态管理与事件处理的基本概念和实战项目演练,帮助读者全面掌握Flutter语法。

Flutter简介
什么是Flutter

Flutter是由Google开发的一个用于创建跨平台移动应用的开源UI框架。它能够将一套代码库同时运行在Android和iOS平台,同时还支持Web、桌面应用与嵌入式设备。Flutter的目标是帮助开发者更容易地构建高性能的移动应用,并且拥有丰富的动画、手势支持和自定义能力。

Flutter的主要特点
  • 高性能:Flutter采用了自己的渲染引擎,能够实现几乎60帧/秒的动画效果,提供流畅的用户体验。
  • 快速开发:Flutter拥有丰富的组件库,开发者可以快速构建界面,同时支持热重载,可以即时看到代码修改的效果。
  • 跨平台:一套代码可以编译为多个平台的应用程序,包括Android、iOS、Web、桌面应用等。
  • 丰富的动画与手势支持:Flutter提供了强大的动画库,使开发者能够轻松创建复杂的动画效果。同时,Flutter的Widget系统也提供了丰富的手势支持。
  • 自定义能力强:Flutter允许开发者自定义几乎所有组件,这使得应用程序界面可以达到非常高的定制程度。
Flutter的安装与环境配置

安装Flutter SDK

  1. 访问Flutter官网下载Flutter SDK的安装包,根据系统环境选择对应的安装包类型。
  2. 安装完成后,将Flutter SDK的路径添加到环境变量中。

安装Android Studio与配置环境

  1. 下载并安装Android Studio。
  2. 在Android Studio中安装Flutter和Dart插件。
  3. 配置Android SDK路径和虚拟设备。

安装VS Code与配置环境

  1. 安装VS Code编辑器。
  2. 安装Flutter和Dart插件。
  3. 在VS Code中配置Flutter SDK路径:

    flutter config --dart-licenses

安装iOS开发环境

  1. 下载并安装Xcode。
  2. 配置Apple开发者账号:
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
    sudo xcodebuild -license
  3. 配置iOS模拟器和设备。

验证安装是否成功

打开命令行工具,输入以下命令验证安装是否成功:

flutter doctor

若输出无任何警告或错误,则安装成功。

基础语法介绍
Dart语言基础

变量与类型

Dart是一种强类型语言,这意味着在声明变量时必须指定其类型。

int age = 25; // 整型变量
double height = 1.75; // 浮点型变量
String name = "张三"; // 字符串变量
bool isStudent = true; // 布尔型变量

函数

Dart函数用于执行特定任务,通常返回一个值。定义函数的基本语法如下:

int add(int a, int b) {
  return a + b;
}

类与对象

Dart是面向对象的语言,支持类和对象的概念。类定义了对象的结构和行为。

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void introduce() {
    print("My name is $name, I am $age years old.");
  }
}

void main() {
  var person = Person("张三", 25);
  person.introduce();
}
Flutter中的基本组件

概述

Flutter的应用程序主要由Widget构成。Widget可以被看作是一个自定义的UI元素。以下是几个常用的Widget:

  • Text:用于显示文本。
  • Container:容器组件,可以包含其他Widget。
  • Row:水平布局组件。
  • Column:垂直布局组件。
  • RaisedButton:带有提升效果的按钮。
  • Image:用于显示图片。

示例

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Demo"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Hello, Flutter!"),
              Container(
                width: 100,
                height: 100,
                color: Colors.blue,
                child: Text(
                  "Container",
                  style: TextStyle(color: Colors.white),
                ),
              ),
              RaisedButton(
                onPressed: () {},
                child: Text("Button"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
布局与样式

布局

Flutter提供了多种布局方式,如RowColumnWrap等。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Demo"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Hello, Flutter!"),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Icon(Icons.star),
                  Icon(Icons.star),
                  Icon(Icons.star),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

样式

可以通过ThemeThemeData来设置全局样式,也可以通过ContainerText等Widget的属性来设置局部样式。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Demo"),
        ),
        body: Center(
          child: Container(
            padding: EdgeInsets.all(16),
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(10),
            ),
            child: Text(
              "Hello, Flutter!",
              style: TextStyle(color: Colors.white, fontSize: 20),
            ),
          ),
        ),
      ),
    );
  }
}
控制流程与函数
条件语句与循环

条件语句

Dart支持多种条件语句,如ifelse ifelse

int age = 25;

if (age >= 18) {
  print("成年人");
} else if (age >= 13) {
  print("青少年");
} else {
  print("儿童");
}

循环

Dart支持多种循环结构,如forwhiledo-while

// for循环
for (int i = 0; i < 5; i++) {
  print(i);
}

// while循环
int n = 0;
while (n < 5) {
  print(n);
  n++;
}

// do-while循环
int m = 0;
do {
  print(m);
  m++;
} while (m < 5);
函数定义与调用

函数定义

函数定义的基本语法如下:

int add(int a, int b) {
  return a + b;
}

函数调用

void main() {
  int result = add(3, 5);
  print(result); // 输出8
}

函数的重载

Dart支持函数重载。可以通过不同的参数类型或数量来定义多个同名函数。

int add(int a, int b) {
  return a + b;
}

double add(double a, double b) {
  return a + b;
}

void main() {
  int result = add(3, 5);
  double result2 = add(3.5, 5.5);
  print(result); // 输出8
  print(result2); // 输出9.0
}
参数传递与返回值

参数传递

函数参数可以是位置参数、命名参数或可选参数。

void greet(String name, [String? title]) {
  print("Hello, $name!");
  if (title != null) {
    print("Title: $title");
  }
}

void main() {
  greet("张三");
  greet("李四", title: "工程师");
}

返回值

函数可以返回一个值,也可以返回多个值通过return语句。

(int, int) subtract(int a, int b) {
  int result = a - b;
  int remainder = a % b;
  return (result, remainder);
}

void main() {
  var (result, remainder) = subtract(10, 3);
  print("结果: $result");
  print("余数: $remainder");
}
状态管理与事件处理
状态管理基础

在Flutter中,状态管理是非常重要的一个方面。状态管理可以帮助应用更好地响应用户输入和变化。

状态管理的方式

  1. 使用StatefulWidgetsetState:这是最基础的状态管理方式。通过StatefulWidgetState类进行状态管理。
  2. 使用Provider:这是一个流行的第三方库,用于状态管理和依赖注入。
  3. 使用Bloc:一个用于状态管理的架构模式,通过定义事件和状态来进行状态管理。

示例

import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Counter"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            RaisedButton(
              onPressed: _incrementCounter,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterWidget(),
    );
  }
}
事件处理机制

事件监听器

在Flutter中,可以使用GestureDetectorInkWell等Widget来监听触屏事件。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Event Handling"),
        ),
        body: Center(
          child: GestureDetector(
            onTap: () {
              print("按钮被点击了");
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  "点击我",
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

事件处理回调

在Flutter中,事件处理回调通常使用箭头函数定义。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Event Handling"),
        ),
        body: Center(
          child: GestureDetector(
            onTap: () {
              print("按钮被点击了");
            },
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  "点击我",
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
响应式编程简介

响应式编程是一种编程范式,它可以处理变化的数据流。在Flutter中,可以使用StreamStreamBuilder来实现响应式编程。

import 'package:flutter/material.dart';

class CounterBloc {
  Stream<int> get counterStream {
    StreamController<int> controller = StreamController<int>();
    int counter = 0;
    controller.add(counter);

    void increment() {
      counter++;
      controller.add(counter);
    }

    return controller.stream;
  }

  void dispose() {
    // 释放资源
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  CounterBloc _counterBloc = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Counter"),
        ),
        body: StreamBuilder<int>(
          stream: _counterBloc.counterStream,
          initialData: 0,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Center(
                child: Text(
                  "${snapshot.data}",
                  style: TextStyle(fontSize: 30),
                ),
              );
            } else {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            _counterBloc.increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _counterBloc.dispose();
    super.dispose();
  }
}
实战项目演练
创建简单的Flutter应用
  1. 初始化项目:使用flutter create命令创建一个新的Flutter项目。

    flutter create my_app
    cd my_app
  2. 修改主文件:修改lib/main.dart文件。

    import 'package:flutter/material.dart';
    
    void main() {
     runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
       return MaterialApp(
         title: 'My App',
         theme: ThemeData(
           primarySwatch: Colors.blue,
         ),
         home: MyHomePage(),
       );
     }
    }
    
    class MyHomePage extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
       return Scaffold(
         appBar: AppBar(
           title: Text('My App'),
         ),
         body: Center(
           child: Text('Hello, Flutter!'),
         ),
       );
     }
    }
实现基本的交互功能

添加按钮

MyHomePage中添加一个按钮。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @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('My App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            SizedBox(height: 20),
            RaisedButton(
              onPressed: _incrementCounter,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}

添加列表

MyHomePage中添加一个列表。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: ListView(
        children: <Widget>[
          ListTile(
            title: Text("Item 1"),
          ),
          ListTile(
            title: Text("Item 2"),
          ),
          ListTile(
            title: Text("Item 3"),
          ),
          // 更多列表项...
        ],
      ),
    );
  }
}
集成外部资源

集成图片

MyHomePage中集成一个图片资源。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: Center(
        child: Image.asset(
          'assets/images/my_image.png',
          width: 100,
          height: 100,
          fit: BoxFit.cover,
        ),
      ),
    );
  }
}

集成网络资源

MyHomePage中集成一个网络图片资源。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: Center(
        child: Image.network(
          'https://example.com/my_image.png',
          width: 100,
          height: 100,
          fit: BoxFit.cover,
        ),
      ),
    );
  }
}

集成第三方组件

MyHomePage中集成一个第三方组件,例如flutter_svg

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My App'),
      ),
      body: Center(
        child: SvgPicture.asset(
          'assets/svg/my_svg.svg',
          width: 100,
          height: 100,
        ),
      ),
    );
  }
}

集成外部依赖库

pubspec.yaml文件中添加外部依赖库。

dependencies:
  flutter:
    sdk: flutter
  flutter_svg: ^0.19.0

然后在命令行中运行:

flutter pub get
0人推荐
随时随地看视频
慕课网APP