状态栏高度始终返回0

2024-04-05

打电话时MediaQuery.of(context).padding.top在父小部件中(ProductsOverviewScreen)返回的值符合预期 - 24。但是当从嵌套小部件调用相同的属性时(ProductsGrid)我们正在谈论的父级的值始终为 0。这是正常行为吗?


产品概述_screen.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../widgets/app_drawer.dart';
import '../screens/cart_screen.dart';
import '../widgets/products_grid.dart';
import '../widgets/badge.dart';
import '../providers/cart.dart';
import '../providers/products_provider.dart';

enum FilterOptions {
  showAll,
  onlyFavorites,
}

class ProductsOverviewScreen extends StatefulWidget {
  @override
  _ProductsOverviewScreenState createState() => _ProductsOverviewScreenState();
}

class _ProductsOverviewScreenState extends State<ProductsOverviewScreen> {
  bool _showFavorites = false;
  bool _isLoading = false;
  bool _isInit = false;

  @override
  void initState() {
//    Future.delayed(Duration(seconds: 1), () {
//      Provider.of<Products>(context).fetchAndSetProducts();
//    });
    super.initState();
  }

  @override
  void didChangeDependencies() {
    if (!_isInit) {
      setState(() {
        _isLoading = true;
      });
      Provider.of<Products>(context).fetchAndSetProducts().then((_) {
        setState(() {
          _isLoading = false;
        });
      });
    }
    _isInit = true;
    super.didChangeDependencies();
  }

  Future<void> refreshProducts(BuildContext context) async {
    await Provider.of<Products>(context, listen: false).fetchAndSetProducts();
  }

  @override
  Widget build(BuildContext context) {
    final scaffoldKey = GlobalKey();
    final appBar = AppBar(
      title: Text('My Shop'),
      actions: <Widget>[
        Consumer<Cart>(
          builder: (ctx, cart, child) => Badge(
            child: child,
            value: cart.length.toString(),
          ),
          child: IconButton(
            onPressed: () {
              final scaffoldState = scaffoldKey.currentState as ScaffoldState;
              scaffoldState.hideCurrentSnackBar();
              Navigator.of(context).pushNamed(CartScreen.routeName);
            },
            icon: Icon(
              Icons.shopping_cart,
              color: Theme.of(context).accentColor,
            ),
          ),
        ),
        PopupMenuButton(
          onSelected: (FilterOptions selectedValue) {
            setState(() {
              if (selectedValue == FilterOptions.onlyFavorites) {
                _showFavorites = true;
              } else {
                _showFavorites = false;
              }
            });
          },
          icon: Icon(Icons.more_vert),
          itemBuilder: (_) => [
            PopupMenuItem(
                child: Text('Only Favorites'),
                value: FilterOptions.onlyFavorites),
            PopupMenuItem(
              child: Text('Show All'),
              value: FilterOptions.showAll,
            ),
          ],
        ),
      ],
    );

    return Scaffold(
      key: scaffoldKey,
      appBar: appBar,
      drawer: AppDrawer(),
      body: _isLoading
          ? Center(child: CircularProgressIndicator())
          : RefreshIndicator(
              onRefresh: () => refreshProducts(context),
              child: ProductsGrid(_showFavorites, appBar.preferredSize.height),
            ),
    );
  }
}

//56

产品_grid.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../providers/products_provider.dart';
import '../widgets/product_item.dart';

class ProductsGrid extends StatelessWidget {
  final bool _showFavorites;
  final double _appBarHeight;

  ProductsGrid(this._showFavorites, this._appBarHeight);

  @override
  Widget build(BuildContext context) {
    final productsData = Provider.of<Products>(context);
    final products =
        _showFavorites ? productsData.favoriteItems : productsData.items;
    final mediaQuery = MediaQuery.of(context);

    return productsData.items.isEmpty
        ? SingleChildScrollView(
            physics: AlwaysScrollableScrollPhysics(),
            child: Container(
              width: mediaQuery.size.width,
              height: mediaQuery.size.height -
                  mediaQuery.padding.top -
                  _appBarHeight,
//              child: Center(
//                child: Text(
//                  'There are no products.',
//                  style: TextStyle(
//                    color: Colors.grey,
//                    fontSize: 16,
//                  ),
//                ),
//              ),
            ),
          )
        : GridView.builder(
            padding: const EdgeInsets.all(15),
            itemCount: products.length,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              childAspectRatio: 3 / 2,
              crossAxisSpacing: 10,
              mainAxisSpacing: 10,
            ),
            itemBuilder: (ctx, index) => ChangeNotifierProvider.value(
              value: products[index],
              child: ProductItem(),
            ),
          );
  }
}

您可以复制粘贴运行下面的完整代码
您可以使用MediaQueryData.fromWindow(window).padding.top
代码片段

import 'dart:ui';
...
final statusbarHeight2 = MediaQueryData.fromWindow(window).padding.top;

工作演示

完整代码

import 'package:flutter/material.dart';
import 'dart:ui';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: ProductsOverviewScreen(title: 'Flutter Demo Home Page'),
    );
  }
}

class ProductsOverviewScreen extends StatefulWidget {
  ProductsOverviewScreen({Key key, this.title}) : super(key: key);

  final String title;

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

class _ProductsOverviewScreenState extends State<ProductsOverviewScreen> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    final statusbarHeight1 = MediaQueryData.fromWindow(window).padding.top;

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ProductsGrid(),
            Text(
              '$statusbarHeight1',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class ProductsGrid extends StatelessWidget {
  const ProductsGrid({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final statusbarHeight2 = MediaQueryData.fromWindow(window).padding.top;

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

状态栏高度始终返回0 的相关文章

随机推荐

  • 低级鼠标钩子 - 鼠标在断点处冻结

    我想自己绘制和移动我的窗口 使用 chromium 嵌入式框架 为此 当鼠标移动到窗口之外时 我需要一个全局回调 所以我安装了一个低级别的鼠标钩子 hMouseLLHook SetWindowsHookEx WH MOUSE LL HOOK
  • 如何在PIL中减少png图像文件大小

    我已经使用 PIL 将 JPG BMP 文件转换并调整大小为 PNG 格式 我可以轻松调整大小并将其转换为 PNG 但新图像的文件大小太大 im Image open input jpg im resize im resize 400 40
  • 如何将 Mongoose 文档转换为普通对象?

    我有一个来自猫鼬的文档 我想在 JSON 编码并作为响应发送之前进行扩展 如果我尝试向文档添加属性 它将被忽略 该属性未出现在Object getOwnPropertyNames doc 无法正常延长 奇怪的是JSON parse JSON
  • 收到“线程 1:EXC_BAD_ACCESS”错误?

    我正在使用 WKWebView 和 Swift 语言创建一个简单的 Web 查看器 这是我的代码 import Cocoa import WebKit NSApplicationMain class AppDelegate NSObject
  • NSMutableDictionary 以 UIButton* 作为键 - iPhone 开发

    我是 iPhone 开发新手 我有一个问题 可能有一个非常简单的答案 我正在尝试向视图添加按钮 这些按钮与我定义的自定义类相关联 当我将按钮添加到视图中时 我想知道这些按钮对应什么类 这是因为当我按下按钮时 我需要获取有关该类的一些信息 但
  • VKDefault - 三角器未能完全三角化多边形 MapKit

    我遇到了收到警告的问题 VKDefault Triangulator failed to fully triangulate polygon MapKit放大和缩小地图上的特定区域时 我正在从 json 数据创建多边形 该数据可以包含 MK
  • Scikit-learn 的 LabelBinarizer 与 OneHotEncoder

    两者有什么区别 似乎两者都创建了新列 其数量等于特征中唯一类别的数量 然后 他们根据数据点所属的类别将 0 和 1 分配给数据点 下面显示了使用 LabelEncoder OneHotEncoder LabelBinarizer 对数组进行
  • 如何从数据库中获取可为空的 DateTime

    我的 SQL Server 数据库包含可为空的 DateTime 值 如何将它们转换为 C 应用程序中可为 null 的 DateTime 对象 这就是我认为的样子 但事实并非如此 DateTime dt DateTime sqldatar
  • Android:在异步任务期间处理后退按钮

    我有一个显示列表视图的活动 单击项目时 将启动第二个活动 该活动运行一个 AsyncTask 根据单击的项目获取远程 URL 解析结果 然后将这些结果显示到另一个列表视图中 当异步任务运行时 我有一个 正在加载 视图 仅显示图像和文本 问题
  • 如何检测浏览器是否支持flash?

    我的网站只有两个版本 一种是针对支持 Flash 的设计 如桌面设备 另一种是针对移动设备的设计 我只是想知道我是否可以检测到 如果是真的 支持 他们将保持相同的网站假设是http mywebsite com但链接会显示http myweb
  • Java 浮点意外圆角化

    我正在使用浮点常量并将对象私有浮点变量设置为下面的浮点常量 但是当对象输出它设置的值时 它会四舍五入浮点中的最后一位数字 private final float RF FREQUENCY 956 35625f Object o new Ob
  • 如何检查一个控件是否是另一个控件的子控件? “Control.IsChildOf”

    我有 3 个面板
  • 蜡染:Linux 上的 svg 到 pdf(无 X 服务器)

    类似于中的方法将 SVG 转换为 PDF https stackoverflow com questions 6875807 convert svg to pdfsvg2pdf 转换在 Windows 下成功运行 并且可以在生成的 pdf
  • 如何在 ExtJs 中添加复制到剪贴板功能?

    如何在 ExtJs 中添加复制到剪贴板功能 它在 IE 浏览器中工作正常 但在 Firefox 中不行 还需要进行哪些更改才能使其在 FF 浏览器中工作 Code function selectCopy txt txtId Ext getC
  • 为什么 Android Studio 说“未收到测试事件”?

    我正在尝试在我的 Android 应用程序中进行单元测试 这是我正在做的简单测试教程 import static org junit Assert import org junit Test import org junit runner
  • Linux 下签名的可执行文件

    出于安全原因 最好在执行之前检查代码的完整性 避免软件被篡改由攻击者发起 所以 我的问题是 如何在Linux下对可执行代码进行签名并仅运行受信任的软件 我读过范杜姆的作品et al Linux 签名可执行文件的设计和实现 以及 IBM 的T
  • 带有 COUNT 帮助的 SQL 子查询

    我有一个有效的 SQL 语句 SELECT FROM eventsTable WHERE columnName Business 我想将其添加为子查询 COUNT Business AS row count 我该怎么做呢 这可能是最简单的方
  • Visual Studio Code 像 HTML 一样自动关闭标记和缩进 XML

    我开始使用 Visual Studio Code for HTML 和 CSS 因为在我看来 它似乎是一个不错的编辑器 除了这个小问题 当我开始使用它时 我必须获得一个扩展才能获得自动结束标签 我发现的所有扩展似乎都以相同的方式执行此操作
  • Visual Studio Team Services REST API 的 AJAX 跨域问题

    我正在尝试为 Visual Studio Team Services REST API 编写一个 JavaScript 客户端 该客户端将 AJAX 请求发送到我们自托管的 Team Foundation Server 2015 但我面临跨
  • 状态栏高度始终返回0

    打电话时MediaQuery of context padding top在父小部件中 ProductsOverviewScreen 返回的值符合预期 24 但是当从嵌套小部件调用相同的属性时 ProductsGrid 我们正在谈论的父级的