Dart基础语法

变量

声明变量的时候可以指定数据类型,也可以不指定数据类型

  1. var num = 10;
  2. int size = 100;

对于使用var声明的变量,其数据类型会根据存储数据的类型而推导
image.png

一些循环

image.png

Flutter基础组件

MaterialApp

是Flutter中一种风格的组件,此组件一般作为根组件来使用
image.png

Scaffold

实现了Material风格的页面基本布局,提供了对抽屉、底部导航条等组件的API
image.png

AppBar

用来包裹顶部标题等其他内容的容器,其布局如下图所示:
app_bar.png
下图为实际效果
image.png

BottomNavigationBar

底部的页面切换导航容器
通过配置Scaffold 组件的bottomNavigationBar来实现如下图所示的功能

image.png
其中,onTap是点击按钮后的回调,可以获取到被激活选项的索引index
image.png

无状态页面和有状态页面

个人理解:两种页面相比,无状态页面不会保证数据和页面显示内容的关联性,而有状态页面上显示的内容可以由定义的数据所变换,也就是保证了数据的响应性

在Flutter中,万事万物皆Widget,也就是组件

无状态组件:StatelessWidget,基础结构如下所示:
image.png
有状态组件:StatefulWidget,基础结构如下所示:
image.png相比于无状态组件,有状态组件相当于由两部分来组成,将数据(状态)单独抽离出来作为一个类
在需要更新页面数据的时候,需要调用setState()方法,并将要更新的值写在代码逻辑中,来进行更新

有点类似于微信小程序

image.png

路由

Flutter 中的路由通俗的讲就是页面跳转。在Flutter 中通过Navigator 组件管理路由导航。
并提供了管理堆栈的方法。如:Navigator.push 和Navigator.pop

Flutter 中给我们提供了两种配置路由跳转的方式:1、基本路由 2、命名路由

基本路由

假设目前我们想从HomePage组件跳转到SearchPage组件

在HomePage中引入SearchPage组件
并通过以下方法进行跳转

  1. ElevatedButton(
  2. onPressed: (){
  3. Navigator.of(context).push(
  4. MaterialPageRoute(
  5. builder: (BuildContext context) => SearchPage()
  6. )
  7. );
  8. },
  9. child: const Text("跳转")
  10. )

那么假如我们现在需要在页面跳转的时候,携带一些参数过去呢?
也就是如何对一个组件进行传值?

  1. ElevatedButton(
  2. onPressed: (){
  3. Navigator.of(context).push(
  4. MaterialPageRoute(
  5. builder: (BuildContext context) => SearchPage(name: "百度一下") // 相当于 return SearchPage(name: "百度一下")
  6. )
  7. );
  8. },
  9. child: const Text("跳转")
  10. )

然后在SearchPage组件的构造函数中去接收传入的值就可以了

命名路由

创建routes包,并添加Route.dart文件

  1. import 'package:first_test/pages/Search.dart';
  2. import 'package:first_test/pages/tabs/pages/Bussiness.dart';
  3. import 'package:first_test/pages/tabs/pages/Home.dart';
  4. import 'package:first_test/pages/tabs/pages/Teach.dart';
  5. import 'package:flutter/material.dart';
  6. Map<String, Widget Function(BuildContext)> initRoutes(BuildContext context) {
  7. return {
  8. '/home': (context) => const HomePage(),
  9. '/bussiness': (context) => const MyBussinessPage(),
  10. '/teach': (context) => const MyTeachPage(),
  11. '/search': (context, {arguments}) => SearchPage(arguments: arguments)
  12. };
  13. }

添加完成之后,在main文件中对路由进行配置,注册
image.png
之后就可以通过命名路由的方式进行路由跳转了
如下代码所示,其中/search就是路由的名称

  1. child: const Text("搜索一下"),
  2. onPressed: (){
  3. Navigator.pushNamed(context,'/search');
  4. }
  5. )

命名路由中如何传递参数?
官方文档:
Pass arguments to a named route

修改Route.dart文件,并配置命名路由传参

  1. import 'package:first_test/pages/Search.dart';
  2. import 'package:first_test/pages/tabs/pages/Bussiness.dart';
  3. import 'package:first_test/pages/tabs/pages/Home.dart';
  4. import 'package:first_test/pages/tabs/pages/Teach.dart';
  5. import 'package:flutter/material.dart';
  6. Map<String, Widget Function(BuildContext)> initRoutes(BuildContext context) {
  7. return {
  8. '/home': (context) => const HomePage(),
  9. '/bussiness': (context) => const MyBussinessPage(),
  10. '/teach': (context) => const MyTeachPage(),
  11. '/search': (context, {arguments}) => SearchPage(arguments: arguments)
  12. };
  13. }
  14. Route? generateRoutes(RouteSettings settings,BuildContext context) {
  15. final Function? pageContentBuilder = initRoutes(context)[settings.name];
  16. if(pageContentBuilder != null) {
  17. if (settings.arguments != null) {
  18. final Route route = MaterialPageRoute(builder: (context) =>
  19. pageContentBuilder(context, arguments: settings.arguments));
  20. return route;
  21. } else {
  22. final Route route = MaterialPageRoute(
  23. builder: (context) => pageContentBuilder(context));
  24. return route;
  25. }
  26. }
  27. return null;
  28. }

不再通过直接传入路由的方式,而是通过generateRoutes这个方法,来生成对应的路由
因此我们需要修改main.dart文件,配置其中的onGenerateRoute属性,如下所示:

  1. void main() => runApp(MyApp());
  2. class MyApp extends StatelessWidget {
  3. MyApp({Key? key}) : super(key: key);
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. debugShowCheckedModeBanner: false,
  8. home: const DefaultTabController(
  9. length: 2,
  10. child: HomeBottomTabs(),
  11. ),
  12. theme: ThemeData(primarySwatch: Colors.red),
  13. onGenerateRoute: (RouteSettings settings) => generateRoutes(settings, context)
  14. );
  15. }
  16. }

对于需要接收路由参数的组件,我们需要定义其内部对应的参数,并在构造函数中进行接收

  • 无状态组件
    image.png
  • 有状态组件