2

我将此代码用于我的 UI 中的响应性。所以这段代码基本上做的是计算屏幕的大小,我使用下面的函数根据在 Figma 或 Adob​​e XD 中提供给我的设计来放置确切的字体大小。使用这种方法,我能够创建像素完美的 UI。

升级到 后Flutter 2.0.3,我收到空安全错误。我能够解决其中的大部分问题,但我无法解决此错误。请指教。

Complete Code

import 'package:flutter/material.dart';

class SizeConfig {
  static MediaQueryData? _mediaQueryData;
  static double? screenWidth;
  static double? screenHeight;
  static double? defaultSize;
  static Orientation? orientation;

  void init(BuildContext context) {
    _mediaQueryData = MediaQuery.of(context);
    screenWidth = _mediaQueryData!.size.width;
    screenHeight = _mediaQueryData!.size.height;
    orientation = _mediaQueryData!.orientation;
    if (orientation == Orientation.landscape) {
      defaultSize = screenHeight! * 0.024;
    } else {
      defaultSize = screenWidth! * 0.024;
    }
  }
}

double getSize(double size) {
  var defaultsSize = SizeConfig.defaultSize * size;
  return (defaultsSize / 10);
}

// Get the proportionate height as per screen size
double getProportionateScreenHeight(double inputHeight) {
  double screenHeight = SizeConfig.screenHeight!;
  // 812 is the layout height that designer use
  return (inputHeight / 812.0) * screenHeight;
}

// Get the proportionate width as per screen size
double getProportionateScreenWidth(double inputWidth) {
  double screenWidth = SizeConfig.screenWidth!;
  // 375 is the layout width that Figma provides
  return (inputWidth / 375.0) * screenWidth;
}

Error

4

3 回答 3

2

因为SizeConfig.defaultSize是可空的,所以你需要确保它的值不应该为空。

您可以添加一些断言来通知SizeConfig应首先初始化的调用者。然后,您可以将其更改为SizeConfig.defaultSize!.

样本...

double getSize(double size) {
  assert(
    SizeConfig.defaultSize != null,
    "SizeConfig should be initialized (only once) before calling getSize(...). Refer to SizeConfig.init(...).",
  );
  var defaultsSize = SizeConfig.defaultSize! * size;
  return (defaultsSize / 10);
}
于 2021-04-07T12:53:30.967 回答
2

问题:

您收到此错误是因为您正在调用的对象*可以是null.

例子:

int? count = 1;

void main() {
  print(count * 2); // error: The operator '*' can't be unconditionally invoked ...
}

解决方案:

  • 使用局部变量:

    int? count = 1;
    
    void main() {
      var i = count;
      if (i != null) {
        print(i * 2); // Prints 2
      }
    }
    
  • 使用 bang 运算符 ( !)

    int? count = 1;
    
    void main() {
      print(count! * 2); // Prints 2
    }
    
于 2021-05-25T14:47:26.493 回答
2

你有三个选择:

  • 使用 bang 运算符:
int? count = 1;

void main() {
  // will throw an error if count is null
  print(count! * 2);
}
  • 使用 ??操作员:
int? count = 1;

void main() {
  // safe
  print((count ?? 1) * 2);
}
  • 使用 if - else 语句:
int? count = 1;

void main() {
  if(count != null) {
    print(count! * 2);
  } else {
    print('count is null');
  }
}
于 2021-07-12T09:23:32.063 回答