pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Flutter中獲取屏幕及Widget的寬高示例代碼

這篇文章主要給大家介紹了關于Flutter中如何獲取屏幕及Widget的寬高的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Flutter具有一定的參考學習價值,需要的朋友們

前言

我們平時在開發中的過程中通常都會獲取屏幕或者 widget 的寬高用來做一些事情,在 Flutter 中,我們有兩種方法來獲取 widget 的寬高。

MediaQuery

一般情況下,我們會使用如下方式去獲取 widget 的寬高:


final size =MediaQuery.of(context).size;
final width =size.width;
final height =size.height; 

但是如果不注意,這種寫法很容易報錯,例如下面的寫法就會報錯:


import 'package:flutter/material.dart';

class GetWidgetWidthAndHeiget extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 final size =MediaQuery.of(context).size;
 final width =size.width;
 final height =size.height;
 print('width is $width; height is $height');
 return MaterialApp(
  home: Scaffold(
  appBar: AppBar(
   title: Text('Width & Height'),
  ),
  body: Container(
   width: width / 2,
   height: height / 2,
  ),
  ),
 );
 }
}

在代碼中,我們是想獲取屏幕的寬和高,然后將屏幕寬高的一半分別賦值給 Container 的寬和高,但上述代碼并不能成功運行,會報如下錯誤:

flutter: The following assertion was thrown building GetWidgetWidthAndHeiget(dirty):
flutter: MediaQuery.of() called with a context that does not contain a MediaQuery.
flutter: No MediaQuery ancestor could be found starting from the context that was passed to MediaQuery.of().
flutter: This can happen because you do not have a WidgetsApp or MaterialApp widget (those widgets introduce
flutter: a MediaQuery), or it can happen if the context you use comes from a widget above those widgets.

從錯誤異常中我們可以大概了解到有兩種情況會導致上述異常:

  • 當沒有 WidgetsApp or MaterialApp 的時候,我們使用 MediaQuery.of(context) 來獲取數據。
  • 當我們在當前小部件中使用了上一個小部件的 context,來使用 MediaQuery.of(context) 獲取數據的時候。

我們上述的代碼很顯然是屬于第一種情況,也就是說我們在使用 MediaQuery.of(context) 的地方并沒有一個 WidgetsApp or MaterialApp 來提供數據。

解決方法就是將 MediaQuery.of(context) 挪到 MaterialApp 內,如下:


import 'package:flutter/material.dart';

class GetWidgetWidthAndHeiget extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return MaterialApp(
  home: HomePage(),
 );
 }
}

class HomePage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 final size = MediaQuery.of(context).size;
 final width = size.width;
 final height = size.height;
 print('width is $width; height is $height');
 return Scaffold(
  appBar: AppBar(
  title: Text('Width & Height'),
  ),
  body: Center(
  child: Container(
   color: Colors.redAccent,
   width: width / 2,
   height: height / 2,
  ),
  ),
 );
 }
}

運行效果及輸出如下:

flutter: width is 414.0; height is 896.0

上述代碼中,我們獲取的是 MaterialApp 的寬高,也就是屏幕的寬高


那么如果我們要需要知道上述紅色的 Container 容器的寬高怎么辦呢?這里我們可以使用 GlobalKey

GlobalKey

使用 GlobalKey 的步驟如下:

  • 聲明一個 GlobalKey final GlobalKey globalKey = GlobalKey();
  • 給 widget 設置 GlobalKey key: globalKey
  • 通過 globalKey 來獲取該 widget 的 size

final containerWidth = globalKey.currentContext.size.width;
final containerHeight = globalKey.currentContext.size.height;
print('Container widht is $containerWidth, height is $containerHeight');

修改過后的 HomePage 代碼如下:


class HomePage extends StatelessWidget {

 final GlobalKey globalKey = GlobalKey();

 void _getWH() {
 final containerWidth = globalKey.currentContext.size.width;
 final containerHeight = globalKey.currentContext.size.height;
 print('Container widht is $containerWidth, height is $containerHeight');
 }

 @override
 Widget build(BuildContext context) {
 final size = MediaQuery.of(context).size;
 final width = size.width;
 final height = size.height;
 print('width is $width; height is $height');
 return Scaffold(
  appBar: AppBar(
  title: Text('Width & Height'),
  ),
  body: Center(
  child: Container(
   key: globalKey,
   color: Colors.redAccent,
   width: width / 2,
   height: height / 2,
  ),
  ),
  floatingActionButton: FloatingActionButton(
  onPressed: _getWH,
  child: Icon(Icons.adjust),
  ),
 );
 }
}

上述代碼中,我們將聲明的 globalKey 設置給了 Container , 當我們點擊頁面中的 FloatingActionButton 的時候,就會使用 globalKey 來獲取 Container 的寬高,也就是_getWH() 中執行的代碼。

運行結果及輸出如下:

flutter: Container widht is 207.0, height is 448.0

如果錯誤,還請指出,謝謝

完整源碼

參考鏈接

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對html5模板網的支持。

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 一点车讯-汽车网站,每天一点最新车讯! | 物流公司电话|附近物流公司电话上门取货 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 联系我们-腾龙公司上分客服微信19116098882 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 温州在线网| 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 湖南自考_湖南自学考试| 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 智能气瓶柜(大型气瓶储存柜)百科 | 电销卡_稳定企业大语音卡-归属地可选-世纪通信 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | 标策网-专注公司商业知识服务、助力企业发展 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 |