我正在寻找计算两种情况下可用的有效空间:(01)当MIDI键盘不是MIDI,和(02)当MIDI键盘是MIDI.effective space我指的是通过扣除AppBar占用的空间来获得的空间(也许这也会覆盖顶部状态栏?),然后是下面的TextField,和底部的MIDI键盘(当MIDI)和底部的工具?/导航?wine 吧

我试过问题底部列出的sources个代码.到目前为止,我能够得到设备的物理和逻辑高度,逻辑高度的MIDI键盘,但我卡住了部分—获得的逻辑高度的小部件.我试过实施GlobalKey,但没有成功.我无法得到高度,并且发生了一个错误,我没有成功地解决.错误的位置包含在以下代码的多行注释中.错误说—"属性'size'不能被无条件访问,因为接收器可以是null.... ".我try 使用?!操作符来解决空条件,但没有任何工作.

如何解决这个问题以获得小部件的高度?此外,对于我的目标提出建议是最受欢迎的.

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey? _key01 = GlobalKey();

  late final TextEditingController firstController;

  String result = "";
  String effective_available_screen_height = "";
  String dimensions = "";

  FlutterView view = WidgetsBinding.instance.platformDispatcher.views.first;

  late Size size;
  double width = 0;
  double height = 0;
  double height01 = 0;

  @override
  void initState() {
    super.initState();
    firstController = TextEditingController();
  }

  @override
  void dispose() {
    firstController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    Size ph_size = view.physicalSize;
    double ph_height = ph_size.height;

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

    final padding = MediaQuery.of(context).viewPadding;
    height01 = height - padding.top - padding.bottom;

    effective_available_screen_height = "$height01";

    // Height of Keyboard when onscreen (ohterwise zero):
    double keyboard_height = MediaQuery.of(context).viewInsets.bottom;

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Container(
        padding: const EdgeInsets.all(5.0),
        child: Column(
          children: [
            Container(
              child: Row(
                children: [
                  Expanded(
                    flex: 5,
                    child: Container(
                      padding: const EdgeInsets.all(5.0),
                      child: TextField(
                        key: _key01,
                        style: const TextStyle(
                          fontSize: 16,
                        ),
                        controller: firstController,
                        keyboardType: TextInputType.number,
                        onChanged: (value) {
                          setState(() {
                            result = value;
                            /*
                            // The following gave error:
                            dimensions =
                                "${_key01?.currentContext.size.height}";
                            */
                            dimensions = "${_key01?.currentContext}";
                          });
                        },
                      ),
                    ),
                  ),
                  const Expanded(
                    flex: 5,
                    child: Text("Input Value"),
                  ),
                ],
              ),
            ),
            Text("Result = $result"),
            Text("Total physical height = $ph_height"),
            Text("Total logical height = $height"),
            Text("Onscreen Keyboard height = $keyboard_height"),
            Text(
                "Working Height Available (logical) = $effective_available_screen_height"),
            Text("Dimensions: $dimensions"),
          ],
        ),
      ),
    );
  }
}

Sources of Help:

推荐答案

如果你想在做任何动作时得到高度,你只需要使用这个:

 dimensions ="${_key01.currentContext?.size?.height}";

但是,如果你想在渲染小部件时获得高度,你可以在initState上使用它:

   WidgetsBinding.instance.addPostFrameCallback((timeStamp) { 
       setState((){ 
          dimensions ="${_key01.currentContext?.size?.height}";
       });

    });

Flutter相关问答推荐

Flutter:sqflite DB

无法在主屏幕视图中设置当前日期容器'

DART 3.3:为什么扩展类型不起作用?

如何在Firebase项目中更改包名称和包ID

BlocBuilder仅生成一次,并在后续发出时停止重建

我怎样才能go 掉这个底部导航栏上的白色背景

Flutter http 请求获取 null

在Flutter中为容器实现线性渐变背景动画

获取通过列表呈现的相同 TextEditingController 的值

Flutter 中的 Provider 不会在第一次构建 App 时返回

我对 Flutter Apk 有疑问

Flutter canvas 绘制不同 colored颜色 的原始点

Flutter 动保存新的变量值

Flutter 错误:OutletListModel类型的值不能分配给List类型的变量?

java.lang.IncompatibleClassChangeError:找到接口 com.google.android.gms.location.SettingsClient,

按下 Command+W 时关闭窗口

Flutter 错误:正文可能正常完成,导致返回null

如何修复int类型不是String类型的子类型

如何使用 Row 和 Column 制作 L 形布局?

带图像封面的 ElevatedButton