【第二天 - Flutter 继承+建构子+CallBack 基本概念】

前言

今日的程序码 => GITHUB

继承

Flutter 会有三个方式

  1. Extends
  • 当继承 Extends 的时候,需要使用 super 来继承父类别的 method.
  • 继承一次只能继承一个父亲类别
  • 建构函数不能继承
  • 调用父类别的 method 需要使用 super
  • 可以覆写父亲类别的 method
 @override
 void animal() {
   // TODO: implement animal
   super.animal();
 }
  1. With
  • 可以直接使用父亲的 method
  • 可以混合很多个
  1. implements
  • class 就是 interface
  • 需要实作介面。
  • 可以实作很多个介面
class Animal {
  void animal() {}
}

class Fly {
  String className = "carton";

  void fly() {}
}

class Swim {
  void swimming() {}
}

class Eat {
  void eat() {}
}

class Draink {
  void drink() {}
}

class AAA extends Animal with Eat, Draink implements Fly, Swim {
  @override
  String className = "AAA";

  void turnOn() {
    super.animal();
    _test();
    eat();
    drink();
  }

  void _test() {}

  @override
  void fly() {
    // TODO: implement Fly
  }

  @override
  void swimming() {
    // TODO: implement Swim
  }
}

建构子

StatelessWidget

  1. 给予预设值(可以传参数,也可以不传)
class MyWidget extends StatelessWidget {
  
  final String title;
  
  const MyWidget({Key? key, this.title = 'abc'}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text(title);
  }
}
MyWidget(title: 'cc'), // 显示 cc 
MyWidget(), // 显示 abc
  1. Required(被要求一定要传参数)
class MyWidget extends StatelessWidget {

  final String title;

  const MyWidget({Key? key,required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text(title);
  }
}
MyWidget(title: 'cc'), // 显示 cc 
  1. 私有化的参数
class MyWidget extends StatelessWidget {

  final String _title;

  const MyWidget({String title = '3'}) : _title = title;
  // const MyWidget({required String title}) : _title = title;

  @override
  Widget build(BuildContext context) {
    return Text(_title);
  }
}

StatefulWidget

  1. 给予预设值(可以传参数,也可以不传)
class MyWidget extends StatefulWidget {

  final String title;

  const MyWidget({Key? key, this.title = 'abc'}) : super(key: key);

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

class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.title);
  }
}
MyWidget(title: 'cc'), // 显示 cc 
MyWidget(), // 显示 abc
  1. Required(被要求一定要传参数)
class MyWidget extends StatefulWidget {

  final String title;

  const MyWidget({Key? key,required this.title}) : super(key: key);

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

class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.title);
  }
}
MyWidget(title: 'cc'), // 显示 cc 
  1. 私有化的参数
class MyWidget extends StatefulWidget {

  final String _title;

  const MyWidget({String title = '3'}) : _title = title;

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

class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    return Text(widget._title);
  }
}

CallBack

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: TextView(
        callback: (String text) => _showDialog(context, text)),
    );
  }

  void _showDialog(BuildContext context, String text) {
    showDialog<void>(
        context: context, builder: (context) => AlertDialog(title: Text(text)));
  }
}

class TextView extends StatefulWidget {
  const TextView({required this.callback});

  final void Function(String text) callback;

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

class _TextViewState extends State<TextView> {
  final _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        TextFormField(controller: _controller),
        IconButton(
          onPressed: () async => widget.callback(_controller.text),
          icon: Icon(Icons.check),
        )
      ],
    );
  }
}

我们现在假设有一个情境:

  • 我的子元件是一个输入匡,我的父元件是一个 Scaffold,里面有一个 showDialog 的 method
  • 今天我需要在父元件里面取得子元件输入匡的文字传给 showDailog。
  1. 确定我们关键参数是什麽。是输入匡的文字。因此在 TextView 这个 class 里面建立一个 function
final void Function(String text) callback;
final Function callback; // 这样也可以,但是不建议,因为这样很难 DeBug
  1. 并要求父元件一定要有这个方法
const TextView({required this.callback});
  1. 接着我们在按钮的 onPressed call 这个 function
onPressed: () async => widget.callback(_controller.text),
  1. 当我们在父亲元件使用 TextView 这个子元件时,callback 里面的 text 就是我们子元件输入匡的 text 了。
TextView(callback: (String text) {  },),

<<:  【Day1】odoo的基础知识

>>:  Day2 介绍网页的基础架构

[Day 28] - 手把手跨出第一步!– (1)烧录闪烁程序到Arduino Part.1

17King 制造中,订阅一下吧(*´∀`)~♥ 今日影片长度:07 分 32 秒 本集重点条列: ...

Day.23 分析语法效能必备 - MYSQL语法优化 ( Explain)

在前面的日志介绍中,可以透过slow log纪录去找到有问题执行时间久的SQL语句,那有了资料後该...

[DAY 3] _ 开发板规划补充(stm32f030)

先聊个题外话因为是第一次参加这种比赛,我从来没有这样发文过,我第一天担心很多,这30天会不会很难发文...

[经典回顾]知名通讯软件过度存取用户资讯事件

老议题+最近新闻 厂商的说法 iOS系统为App开发者提供相簿更新通知标准能力,相簿发生内容更新时会...