第四十七回:MaterialApp Widget

文章介绍了MaterialAppWidget在Flutter中的作用,作为App的入口,它用于构建程序框架,包括页面路由和主题设置。MaterialApp的属性如title、routes、home和theme分别用于控制标题、导航、主页内容和应用主题。示例代码展示了如何自定义App的主颜色和背景色,并通过debugShowCheckedModeBanner属性控制Debug标志的显示。


我们在上一章回中介绍了Transform Widget相关的内容,本章回中将介绍 MaterialApp Widget.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在这里说的MaterialApp没有具体的物理形态,它主要用作App的入口。通过它可以快速搭建程序的框架,比如页面的路由,程序的主题等。如果有看官们做过Android开发肯定知道MaterialDesign,这是Google提出的一种设计风格,在此框架上搭建的App具有MaterialDesign风格。

使用方法

虽然我们看不到MaterialApp的物理形态,但是它仍然是一个Widget,它提供了相关的属性来控制App的设计风格,下面是一些常用的属性:

  • title属性:主要用来控制App的标题,也可以在Scaffold组件的AppBar属性中设置;
  • routes属性:主要用来控制App的路由,为App提供页面之间的导航功能;
  • home属性:主要用来控制App主窗口中显示的内容,通常使用Scaffold组件对象给它赋值;
  • theme属性:主要用来控制App的主题,比如文字大小和颜色等;

示例代码

class _ExMaterialAppState extends State<ExMaterialApp> {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      //如果MaterialApp有嵌套,那么每个都需要设置,特别是最外层的MaterialApp
      //外层设置后这里也要设置,不然不起作用,仍然显示Debug字样
      debugShowCheckedModeBanner: false,

      routes: ,//省略不写
      home: Scaffold(
        appBar: AppBar(
          title: Text("Example of Material App"),
          ),
        body: ElevatedButton(
          child: Text("Button"),
          onPressed: (){},
        ),
      ),
      theme: ThemeData(
        //用来控制主要的颜色,比如AppBar,button和默认颜色
        primarySwatch: Colors.deepPurple,
        //用来控制body体内的主要颜色
        scaffoldBackgroundColor: Colors.blueGrey,
      ),
    );
  }
}

我们在上面的代码中使用了上一个小节中介绍的常用属性,在代码的关键地方都添加了注释,方便大家理解代码的含义。编译并且运行上面的程序,可以看到一个App的界面,与以前介绍过的App界面相比,界面的整体风格相同,不同的地方是界面的主颜色由默认的蓝色变成了紫色,界面背景色也从默认的白色变成了灰色。我在这里就不演示程序的运行效果图了,建议大家自己动手去实践,真正体会一下界面之间的差异。

此外,我要介绍了一下debugShowCheckedModeBanner属性,它用来控制是否在界面右上角显示Debug文字,默认值是true,修改为false后就不会在界面上显示Debug文字。在Flutter中,App中的每个界面右上角都会显示这样的文字,刚开始运行Flutter时有点不习惯,不过换一种思路想:它是在告诉我们当前程序是Debug版本。心里也有平衡了。其实Flutter的设计者也是这么想的,因为在正式的Release版本中不会显示Debug文字。如果大家实在看不习惯就修改该属性的值。

看官们,关于MaterialApp Widget的内容就介绍到这里,欢迎大家在评论区交流与讨论!

setState() or markNeedsBuild() called when widget tree was locked. This BetterPlayerSubtitlesDrawer widget cannot be marked as needing to build because the framework is locked. The widget on which setState() or markNeedsBuild() was called was: BetterPlayerSubtitlesDrawer state: _BetterPlayerSubtitlesDrawerState#42f65 When the exception was thrown, this was the stack: #0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:5193:9) #1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:5203:6) #2 State.setState (package:flutter/src/widgets/framework.dart:1224:15) #3 _BetterPlayerSubtitlesDrawerState._updateState (package:better_player_plus/src/subtitles/better_player_subtitles_drawer.dart:79:7) #4 ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:437:24) #5 ValueNotifier.value= (package:flutter/src/foundation/change_notifier.dart:559:5) #6 VideoPlayerController.pause (package:better_player_plus/src/video_player/video_player.dart:442:5) #7 BetterPlayerController.pause (package:better_player_plus/src/core/better_player_controller.dart:584:34) #8 BetterPlayerController.dispose (package:better_player_plus/src/core/better_player_controller.dart:1207:9) #9 _BetterPlayerState.dispose (package:better_player_plus/src/core/better_player.dart:115:23) #10 StatefulElement.unmount (package:flutter/src/widgets/framework.dart:5840:11) #11 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2078:13) #12 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #13 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:7012:16) #14 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #15 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #16 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #17 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #18 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #19 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #20 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #21 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #22 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #23 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #24 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #25 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #26 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #27 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #28 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:7012:16) #29 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #30 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #31 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #32 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #33 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #34 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #35 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #36 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #37 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #38 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #39 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #40 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #41 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #42 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #43 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #44 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #45 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #46 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #47 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #48 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #49 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #50 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #51 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #52 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #53 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #54 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #55 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #56 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #57 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #58 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #59 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #60 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #61 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #62 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #63 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #64 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #65 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #66 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #67 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #68 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #69 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #70 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #71 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #72 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #73 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #74 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #75 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #76 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #77 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #78 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #79 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #80 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #81 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #82 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #83 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #84 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #85 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #86 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #87 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #88 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #89 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #90 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #91 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #92 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #93 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #94 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #95 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #96 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #97 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #98 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #99 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #100 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #101 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #102 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #103 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #104 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #105 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #106 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #107 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #108 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #109 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #110 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #111 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #112 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #113 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #114 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #115 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #116 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #117 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #118 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #119 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #120 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #121 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #122 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #123 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #124 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #125 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #126 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #127 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #128 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #129 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #130 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #131 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #132 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #133 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #134 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #135 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #136 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #137 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #138 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #139 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #140 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #141 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #142 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #143 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #144 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #145 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #146 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #147 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #148 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #149 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #150 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #151 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #152 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #153 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #154 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #155 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #156 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #157 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #158 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #159 ListIterable.forEach (dart:_internal/iterable.dart:49:13) #160 _InactiveElements._unmountAll (package:flutter/src/widgets/framework.dart:2087:25) #161 BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2954:15) #162 BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:3264:7) #163 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1183:19) #164 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:475:5) #165 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1397:15) #166 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1318:9) #167 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1176:5) #168 _invoke (dart:ui/hooks.dart:312:13) #169 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:427:5) #170 _drawFrame (dart:ui/hooks.dart:283:31) The VideoPlayerController sending notification was: VideoPlayerController#77d27(VideoPlayerValue(duration: 0:51:26.720000, size: Size(1920.0, 960.0), position: 0:00:08.695000, absolutePosition: null, buffered: [DurationRange(start: 0:00:00.000000, end: 0:00:08.695000)], isPlaying: false, isLooping: false, isBuffering: false, volume: 1.0, errorDescription: null)) ==================================================================================================== E/flutter (17057): [ERROR:f. 问题还在
07-18
`Widget::Widget` 通常是 C++ 中类的构造函数定义方式,它是 `Widget` 类的构造函数。在使用 Qt 框架开发桌面应用程序时会经常出现这样的构造函数。 ### 代码示例及含义解释 ```cpp Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); } ``` - **函数声明部分**: - `Widget::Widget`:在 C++ 中,类的构造函数名类名相同,`Widget::` 明确这是 `Widget` 类的构造函数。 - `(QWidget *parent)`:构造函数的参数列表,接受一个指向 `QWidget` 类型对象的指针 `parent`。在 Qt 里,很多窗口部件类的构造函数都会有一个 `parent` 参数,其作用是指定该窗口部件的父对象。当父对象被销毁时,它的所有子对象也会被自动销毁,有助于管理内存和窗口层次结构 [^2]。 - **初始化列表部分**: - `QWidget(parent)`:调用基类 `QWidget` 的构造函数,并把 `parent` 指针传递给它,在初始化 `Widget` 对象时先对其基类部分进行初始化。 - `ui(new Ui::Widget)`:初始化成员变量 `ui`,使用 `new` 运算符动态分配一个 `Ui::Widget` 类型的对象,并将其地址赋值给 `ui`。在 Qt 中,`Ui::Widget` 通常是使用 Qt Designer 设计界面后自动生成的类,包含了界面上各个控件的定义和布局信息 [^2]。 - **构造函数体部分**: - `ui->setupUi(this)`:调用 `ui` 对象的 `setupUi` 方法,并将当前 `Widget` 对象的指针 `this` 作为参数传入。该方法会根据 `Ui::Widget` 类中定义的界面信息,将各个控件添加到当前 `Widget` 上,完成界面的初始化工作 [^2]。 ### 使用方法 以下是一个简单的使用示例: ```cpp #include <QApplication> #include <QWidget> #include "ui_widget.h" class Widget : public QWidget { public: Widget(QWidget *parent = nullptr) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); } ~Widget() { delete ui; } private: Ui::Widget *ui; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } ``` 在上述示例中,首先定义了一个 `Widget` 类,在其构造函数中调用了 `ui->setupUi(this)` 完成界面初始化。在 `main` 函数中创建了 `Widget` 对象并显示出来。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值