【重要】带你揭开Flutter中的面向对象-辅导说明和源码

来源:5-7 带你揭开Flutter中的面向对象(标准构造方法、初始化列表)

CrazyCodeBoy

2019-08-01

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_dart_learn/data_type.dart';
import 'package:flutter_dart_learn/oop_learn.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter必备Dart基础',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter必备Dart基础'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    _oopLearn();
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ListView(
          children: <Widget>[
//            DataType(),
          ],
        ),
      ),
    );
  }

  void _oopLearn() {
    //创建Student的对象
    Student stu1 = Student('清华', 'Jack', 18);
    stu1.school = '985';
    print(stu1.toString());
    Student stu2 = Student('北大', 'Tom', 16, city: '上海', country: '中国');
    print(stu2.toString());

    Student.doPrint('_oopLearn');

    StudyFlutter sf = StudyFlutter();
    sf.study();

    Logger log1 = Logger();
    Logger log2 = Logger();
    print(log1 == log2);
  }
}

oop_learn.dart

///面向对象(OOP)
class Student extends Person {
  //定义类的变量
  String _school; //通过下划线来标识私有字段(变量)
  String city;
  String country;
  String name;
  static Student instance;

  ///构造方法:
  ///通this.school初始化自有参数
  ///name,age交给父类进行初始化
  ///city为可选参数
  ///country设有默认参数
  Student(this._school, String name, int age,
      {this.city, this.country = 'China'})
      //初始化列表:除了调用父类构造器,在子类构造器方法体之前,你也可以初始化实例变量,不同的初始化变量之间用逗号分隔开
      : name = '$country.$city',
        //如果父类没有默认构造方法(无参构造方法),则需要在初始化列表中调用父类构造方法进行初始化
        super(name, age) {
    //构造方法体不是必须的
    print('构造方法体不是必须的');
  }

  //命名构造方法:[类名+.+方法名]
  //使用命名构造方法为类实现多个构造方法
  Student.cover(Student stu) : super(stu.name, stu.age) {
    print('命名构造方法');
  }

  //命名工厂构造方法:factory [类名+.+方法名]
  //它可以有返回值,而且不需要将类的final变量作为参数,是提供一种灵活获取类对象的方式。
  factory Student.stu(Student stu) {
    return Student(stu._school, stu.name, stu.age,
        city: stu.city, country: stu.country);
  }

  @override
  String toString() {
    return 'name:$name school:${this._school},city:$city,country:$country ${super.toString()}';
  }

  //可以为私有字段设置getter来让外界获取到私有字段
  String get school => _school;

  //可以为私有字段设置setter来控制外界对私有字段的修改
  set school(String value) {
    _school = value;
  }

  //静态方法
  static doPrint(String str) {
    print('doPrint:$str');
  }

  ///科普小知识:实例方法,对象的实例方法可以访问到实例变量与this,如上述代码中的toString
}

///定一个Dart类,所有类都继承自Object
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  ///重写父类方法
  @override
  String toString() {
    return 'name:$name, age:$age';
  }
}

///工厂构造方法演示
class Logger {
  static Logger _cache;

//  工厂构造方法:
//  不仅仅是构造方法,更是一种模式
//  有时候为了返回一个之前已经创建的缓存对象,原始的构造方法已经不能满足要求
//  那么可以使用工厂模式来定义构造方法
  factory Logger() {
    if (_cache == null) {
      _cache = Logger._internal();
    }
    return _cache;
  }

  Logger._internal();

  void log(String msg) {
    print(msg);
  }
}

///继承抽象类要实现它的抽象方法,否则也需要将自己定义成抽象类
class StudyFlutter extends Study {
  @override
  void study() {
    print('Learning Flutter');
  }
}

///使用 abstract 修饰符来定义一个抽象类,该类不能被实例化。抽象类在定义接口的时候非常有用,实际上抽象中也包含一些实现
abstract class Study {
  void study();
}

///为类添加特征:mixins
///mixins 是在多个类层次结构中重用代码的一种方式
///要使用 mixins ,在 with 关键字后面跟一个或多个 mixin 的名字(用逗号分开),并且with要用在extends关键字之后
///mixins的特征:实现 mixin ,就创建一个继承 Object 类的子类(不能继承其他类),不声明任何构造方法,不调用 super
///猜猜上面的类中哪个是mixin?

class Test extends Person with Study {
  Test(String name, int age) : super(name, age);

  @override
  void study() {
    // TODO: implement study
  }
}
写回答

2回答

CrazyCodeBoy

提问者

2019-08-01

以上。

1
1
慕无忌6890528
"以上" 是什么意思? 是需要全部代码吗?
2022-02-17
共1条回复

DwC

2021-09-19

///工厂构造方法演示

这个案例部分好像需更新;

0
1
一半火焰
为啥这么说?
2021-12-03
共1条回复

Flutter从入门到进阶 实战携程网App 一网打尽核心技术

解锁Flutter开发新姿势,,系统掌握Flutter开发核心技术。

4788 学习 · 3270 问题

查看课程