FirebaseMessaging.instance.getInitialMessage() 不适用于启动画面

2023-12-13

在 GetX 状态管理的帮助下,我已将 Firebase Cloud Messaging 集成到我的 Flutter 移动应用中。我还使用 Laravel 和 Firebase Admin SDK 向我的应用程序发送通知。

该通知在前台状态和后台状态(已暂停)下都运行良好。当我单击应用程序处于终止状态(应用程序关闭)的通知时,问题就开始了。我是否必须在启动画面和主页之间设置延迟?

我已经尝试这样做但仍然出现错误

//open notif content from terminated state of the app
FirebaseMessaging.instance.getInitialMessage().then((message) {
  if (message != null) {
    print('TERMINATED');
    if (FirebaseAuth.instance.currentUser != null) {
      final redirectRoute = message.data['route'];
      if (redirectRoute != null) {    
        //adding delay here since my splashscreen have the same delay        
        Future.delayed(const Duration(seconds: 6));
        bottomnavbarController.updateIndex(int.parse(redirectRoute));
      }
    } else {
      Get.offAllNamed(Routes.LOGIN);
    }
  }
});

我收到这个错误

Unhandled Exception: 
You are trying to use contextless 
navigation without a GetMaterialApp or Get.key

这是我的 main.dart

    //open notif content from terminated state of the app
    FirebaseMessaging.instance.getInitialMessage().then((message) {
      if (message != null) {
        if (FirebaseAuth.instance.currentUser == null) {
          Get.offAllNamed(Routes.LOGIN);
        } else {
          final redirectRoute = message.data['route'];
          if (redirectRoute != null) {
            print('TERMINATED');
            bottomnavbarController.updateIndex(int.parse(redirectRoute));
          }
        }
      }
    });
   

  @override
  Widget build(BuildContext context) {
    final authController = Get.put(AuthController(), permanent: true);
    return FutureBuilder(
      future: Future.delayed(const Duration(seconds: 6)),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return Obx(
            () => GetMaterialApp(
              debugShowCheckedModeBanner: false,              
              title: "Application",
              theme: ThemeData(
                appBarTheme: const AppBarTheme(
                    elevation: 0.2,
                    foregroundColor: Colors.black,
                    backgroundColor: Colors.white),
              ),
              initialRoute: authController.isSkipIntro.isTrue
                  ? authController.isAuthAndVerified.isTrue
                      ? Routes.PAGEWRAPPER
                      : Routes.LOGIN
                  : Routes.INTRODUCTION,
              getPages: AppPages.routes,
            ),
          );
        }

        return FutureBuilder(
          future: authController.firstInitialize(),
          builder: (context, snapshot) {
            return const SplashScreen();
          },
        );
      },
    );
  }

这是我的底部导航控制器

class BottomnavbarController extends GetxController {
  final bottomNavIndex = 0.obs;  
  
  void updateIndex(int index){
    bottomNavIndex.value = index;
    Get.offAllNamed(Routes.PAGEWRAPPER);
  }
}

这是日志

Launching lib\main.dart on RNE L22 in release mode...
Running Gradle task 'assembleRelease'...                           76.4s
√  Built build\app\outputs\flutter-apk\app-release.apk (10.0MB).
Installing build\app\outputs\flutter-apk\app.apk...                 3.4s

Flutter run key commands.
h List all available interactive commands.       
c Clear the screen
q Quit (terminate the application on the device).
W/FlutterJNI(10061): FlutterJNI.loadLibrary called more than once
W/FlutterJNI(10061): FlutterJNI.prefetchDefaultFontManager called more than once
W/FlutterJNI(10061): FlutterJNI.init called more than once
W/FlutterJNI(10239): FlutterJNI.loadLibrary called more than once
W/FlutterJNI(10239): FlutterJNI.init called more than once
I/flutter (10239): Handling a background message: 0:1646807530074172%f77b2610f77b2610
I/flutter (10239): TERMINATED
E/flutter (10239): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: You are trying to use contextless navigation without
E/flutter (10239):       a GetMaterialApp or Get.key.
E/flutter (10239):       If you are testing your app, you can use:
E/flutter (10239):       [Get.testMode = true], or if you are running your app on
E/flutter (10239):       a physical device or emulator, you must exchange your [MaterialApp]
E/flutter (10239):       for a [GetMaterialApp].
E/flutter (10239):
E/flutter (10239): #0      GetNavigation.global (package:get/get_navigation/src/extension_navigation.dart:1094)
E/flutter (10239): #1      GetNavigation.offAllNamed (package:get/get_navigation/src/extension_navigation.dart:786)
E/flutter (10239): #2      BottomnavbarController.updateIndex (package:prototypeapp/app/modules/bottomnavbar/controllers/bottomnavbar_controller.dart:9)
E/flutter (10239): #3      _MyAppState.initState.<anonymous closure> (package:prototypeapp/main.dart:64)
E/flutter (10239): #4      _rootRunUnary (dart:async/zone.dart:1434)
E/flutter (10239): <asynchronous suspension>
E/flutter (10239): 
I/flutter (10239): Null check operator used on a null value
I/flutter (10239): #0      PageRedirect.page (package:get/get_navigation/src/routes/route_middleware.dart:199)
I/flutter (10239): #1      GetMaterialApp.initialRoutesGenerate (package:get/get_navigation/src/root/get_material_app.dart:348)
I/flutter (10239): #2      _WidgetsAppState.build.<anonymous closure> (package:flutter/src/widgets/app.dart:1556)
I/flutter (10239): #3      NavigatorState.restoreState (package:flutter/src/widgets/navigator.dart:3290)
I/flutter (10239): #4      RestorationMixin._doRestore (package:flutter/src/widgets/restoration.dart:887)
I/flutter (10239): #5      RestorationMixin.didChangeDependencies (package:flutter/src/widgets/restoration.dart:873)
I/flutter (10239): #6      NavigatorState.didChangeDependencies (package:flutter/src/widgets/navigator.dart:3336)
I/flutter (10239): #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4914)
I/flutter (10239): #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #10     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #12     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #13     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #18     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #22     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #24     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #30     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #31     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #32     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #36     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #38     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #41     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #42     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #43     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #44     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #46     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #48     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #54     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #55     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #56     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #58     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #60     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928)
I/flutter (10239): #61     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #62     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #63     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4919)
I/flutter (10239): #64     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #65     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #66     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #68     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #69     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #70     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #71     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #72     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #73     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #74     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928)
I/flutter (10239): #75     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #76     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #77     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4919)
I/flutter (10239): #78     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #79     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #80     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #81     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #82     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #83     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #84     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #85     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #86     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #87     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #88     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #89     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #90     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #91     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #92     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)
I/flutter (10239): #94     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)
I/flutter (10239): #95     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)
I/flutter (10239): #96     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)
I/flutter (10239): #97     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)
I/flutter (10239): #98     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)
I/flutter (10239): #99     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)

我现在已经用替代解决方案解决了这个问题。 这是main.dart

@override
void initState() {
  super.initState();

  //open notif content from terminated state of the app
  FirebaseMessaging.instance.getInitialMessage().then((message) {
    if (message != null) {
      print('TERMINATED');
      final redirectRoute = message.data['route'];
      print('redirectRoute $redirectRoute');
      bottomnavbarController.updateIndex(int.parse(redirectRoute));
      //remove redirect route here, so the unknownRoute will trigger the default route
    }
  });

  //only works if app in foreground
  FirebaseMessaging.onMessage.listen((message) {
    LocalNotificationService.display(message);
  });

  //onclick notif system tray only works if app in background but not termi
  FirebaseMessaging.onMessageOpenedApp.listen((message) {
    final redirectRoute = message.data['route'];
    if (redirectRoute != null) {
      print('BACKGROUND');
      print('redirectRoute $redirectRoute');
      bottomnavbarController.updateIndex(int.parse(redirectRoute));
      Get.offAllNamed(Routes.PAGEWRAPPER);
    }
  });
}

@override
Widget build(BuildContext context) {
  final authController = Get.put(AuthController(), permanent: true);
  return FutureBuilder(
    future: Future.delayed(const Duration(seconds: 6)),
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return Obx(
          () => GetMaterialApp(
              debugShowCheckedModeBanner: false,
              title: "Application",
              theme: ThemeData(
                appBarTheme: const AppBarTheme(
                    elevation: 0.2,
                    foregroundColor: Colors.black,
                    backgroundColor: Colors.white),
              ),
              initialRoute: authController.isSkipIntro.isTrue
                  ? authController.isAuthAndVerified.isTrue
                      ? Routes.PAGEWRAPPER
                      : Routes.LOGIN
                  : Routes.INTRODUCTION,
              getPages: AppPages.routes,
              unknownRoute: authController.isAuthAndVerified.isTrue ? AppPages.routes[11] : AppPages.routes[1],
          ),
        );
      }
      return FutureBuilder(
        future: authController.firstInitialize(),
        builder: (context, snapshot) {
          return const SplashScreen();
        },
      );
    },
  );
}

我添加了这个unknownRoute: on GetMaterialApp如果路由为 null,则将数组传递给 pagewrapper o 登录页面内的索引AppPages自路线开始以来的班级getInitialMessage()返回空值。

我已经使用 Get.key 进行了定义,但仍然返回 null。或许app_routes.dart在 GetMaterialApp 之前尚未创建。也许这就是它返回 null 的原因。

我仍然不知道为什么会发生这种情况。也许这是 GetX 插件的一个错误。不管怎样,这对我来说仍然有效,因为我已经更新了底部导航索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FirebaseMessaging.instance.getInitialMessage() 不适用于启动画面 的相关文章

  • 期待活页夹但得到空

    尽管一切正常 但我在日志中收到此消息 W Parcel Expecting binder but got null 有人遇到过这样的问题吗 如何解决 重现步骤 只需创建一个新的 Flutter 项目并在模拟器 仿真器上运行它 查看日志 您将
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • 当您处于飞行模式并退出飞行模式时,我只收到最后一条 FCM 推送通知?

    我只在退出飞行模式后收到最后的推送通知 FCM 但是 如果我的应用程序位于前台 一旦我离开飞行模式 我将收到所有推送通知 我已将 FCM 消息类型实现为通知消息 笔记 无法将 FCM 消息类型实现为数据消息 因为 APNS 只接受我的 iO
  • 使用 Swift 和 Kotlin 重新创建 Flutter 的 ios 和 android 文件夹

    您好 我刚刚发现可以使用 Swift 和 Kotlin 创建 Flutter 项目 但是 我已经投资了当前的项目 并希望重新创建ios and android如 Swift 和 Kotlin 目前默认为 Java 和 ObjC Thanks
  • Flutter 屏幕变化回调

    我想在屏幕更改时收到回调 这样我就可以停止在该特定屏幕上运行的重复请求 dispose 仅在使用 Navigator pop 时调用 而在调用 Navigator push 时不调用 有没有办法检测到屏幕已更改且当前未显示 在您的 Mate
  • 使用 Dio download 下载大视频会导致内存不足

    我正在尝试制作一个具有从 url 下载视频功能的 flutter 应用程序 并且视频预计会很大 至少 1 到 2 小时的 720p 我为此使用了 Dio 但它尝试将完整的视频存储在 RAM 中 这会导致内存不足错误 这是我使用的代码 有什么
  • Flutter:设置AppBar的高度

    我怎样才能简单地设置高度AppBar在颤振中 栏的标题应保持垂直居中 即AppBar 您可以使用首选尺寸 https api flutter dev flutter widgets PreferredSize class html clas
  • Flutter:“UIAlertView”已弃用:首先在 iOS 9.0 中弃用

    我收到以下错误 Users flo pub cache hosted pub dartlang org image picker 0 6 7 12 ios Classes FLTImagePickerPlugin m 1 49 20 war
  • 如何在 Flutter 中解码 Gzip Http 响应?

    我是颤振新手 我正在发出网络请求 并且得到了正确的响应 但数据已被压缩 我已经在 Swift 中解压了相同的内容 但是对于 Flutter 我无法做到这一点 有人可以帮忙吗 这是我尝试过的 import dart convert impor
  • Flutter 的 %1 安装错误不是有效的 win32 应用程序

    我是颤振的新手 并尝试通过以下步骤安装它 1 下载并解压到驱动器中 2 在环境变量中设置路径 现在我正在尝试运行 flutter doctor 它向我显示以下错误 请检查是否有人遇到同样的问题 谢谢 Flutter Channel beta
  • Flutter 错误:找不到正确的 ScopedModel

    我正在尝试在我的 flutter 项目中创建一个范围模型 但我似乎无法弄清楚为什么会出现错误 这个作用域模型实现有什么问题 我有一个带有底部导航器的主页 在个人资料选项卡中 我在树深处的小部件中获取了我需要的关注者列表 因此我尝试使用sco
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • 如何在 Flutter 中显示 Android Activity?

    我目前正在开发一个在 flutter 中使用 Google Maps Api 的应用程序 由于支持不完整 我只能使用静态地图 点击它会导致 Android 活动没有用 我需要的是一张地图 我可以在其中搜索位置并向该位置添加标记 那么是否可以
  • Flutter Firebase 身份验证:启动延迟

    我在应用程序中使用 Provider 和流 FirebaseAuth instance onAuthStateChanged 来决定启动时重定向到哪里 但是尽管用户已经登录 从之前的启动 但应用程序在登录屏幕上启动 几乎 1 秒后重定向到主
  • 如何在 React Native 中使用相同的 Firebase 数据库在两个应用程序之间进行通信?

    我有两个不同的应用程序使用相同的实时数据库 在第一个应用程序中 我发送的订单包含一些要保存在数据库中的数据字段 在另一个应用程序中 我只添加一个侦听器 firebase database ref userOrder currentUser
  • 如何在flutter web中实现视频播放?

    我正在尝试在我的 flutter web 应用程序上播放 firebase 上托管的视频 我不明白这怎么可能 使用 flutter 原生 video player使用插件 但仅适用于 ios 和 android 有人可以告诉我是否可以将视频
  • Flutter Web URL 路由不适用于真实域

    我正在尝试使用一个网址来获取参数并将该参数分配给网络文件内的变量 例如 我的域名是 example com 在这个网站中我需要用户的 ID 我想制作 example com id 123 并获取 123 id 并给出变量 123 值 在 f
  • Flutter showDialog、AlertDialog背景渐变。

    对于颜色 我可以使用dialogBackgroundColor给予的财产AlertDialog背景我自己的颜色 我本来想用Gradient作为我的背景 我该如何使用它 DecoratedBox是需要的东西 但我不知道该用什么包裹起来 谁能给
  • 将方法作为参数传递给小部件

    我有一个自定义按钮小部件 class Button extends StatelessWidget final String text Button this text override Widget build BuildContext
  • 在Flutter中,如何使按钮和文本字段具有相同的高度?

    我知道TextField has TextStyle 其中有一个height财产 这只是一个基于的乘数fontSize 但是如何使所有小部件具有相同的高度 无论字体大小 此外 是否有以下等效方法 在几乎任何其他编程语言中 btnLogin

随机推荐