簡體   English   中英

Flutter,訪問父容器widget的padding值

[英]Flutter, Access the padding value of parent container widget

我有一個 GridView 小部件嵌套在一個 SizedBox 小部件內,該小部件嵌套在一個 Container 小部件內

    Container(
      padding: EdgeInsets.all(10),
      alignment: Alignment(0, 0),
      child: SizedBox(
        width: min(MediaQuery.of(context).size.width,
                MediaQuery.of(context).size.height) -
            20,
        height: min(MediaQuery.of(context).size.width,
                MediaQuery.of(context).size.height) -
            20,
        child: GridView.count(
          padding: EdgeInsets.all(0),
          crossAxisCount: sqrt(tiles.length).round(),
          mainAxisSpacing: 5,
          crossAxisSpacing: 5,
          children: tiles,
          shrinkWrap: true,
        ),
      ),
    ),

Container Widget 的邊緣插入為 10,因此在 SizedBox 中,我希望寬度和高度為最小屏幕寬度/高度減去此邊緣插入(因此為負 20,因為它在每一側)。

如何讀取父小部件的值以便知道它是 edgeInset? MediaQuery 可以通過上下文完成此操作嗎?

我知道我可以更早地將邊緣插入作為變量存儲並在兩個地方使用它,但是當我嘗試學習 Flutter 時,我更好奇是否有辦法讀取父小部件的值/屬性,以便他們的孩子可以隨時參考它們。

如果你提供一些 Widget 一個全局鍵

最終_key = GlobalKey();

Table(
   key: _key,
   children: _getTableRows(),
);

然后你可以像這樣計算小部件的大小:

void _getSize(_) {
final RenderBox _boardRender = _key.currentContext.findRenderObject();
final boardSize = MediaQuery.of(_key.currentContext).size;
final boardOffset = _boardRender.localToGlobal(Offset.zero);

//print('$boardSize:$boardOffset:$cellSize');

}

你可以看看https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html

Container行為有些復雜,因此您的問題的答案將取決於container的父級是誰。從文檔

容器嘗試的順序是:遵守對齊,根據子級調整自身大小,遵守寬度、高度和約束,擴展以適應父級,盡可能小。

例如:如果您將容器放在Scaffoldbody參數中並移除SizedBoxGridView將填充屏幕並具有您指定的填充。 (在這種情況下,您甚至不需要Container而可以使用Padding小部件。)

更廣泛地說,Flutter 在不同的范式中工作,您不需要“知道”父級的細節,因為您可以將任何小部件放置在任何其他小部件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM