0

在我的聊天应用程序中,每条消息都依赖于 MediaQuery(字体缩放)。当键盘出现在 Android 11+ 上时,MediaQuery 中的底部插图将从 0 动画到键盘高度。它会导致对所有消息进行不必要的重建,但它们仅取决于字体缩放。使用 Provider 库,我可以使用select这种情况下的方法。如何使用 MediaQuery 达到相同的结果?

4

1 回答 1

0

由于问题中没有提供代码,我将尝试根据问题描述提供帮助。我在这里看到了多个潜在问题。

  1. viewInsets动画MediaQuery可能不是导致重建的原因。

有人可能认为对 MediaQuery 的依赖textScaleFactor是每次MediaQuery更改时重建的原因,但我敢打赌,即使您删除依赖并只是简单地返回一个 empty Container,它仍然会在键盘折叠动画期间重建。

  1. 那么是什么导致了重建呢?可能是由于键盘弹出应用程序区域扩大/缩小的事实。

例如Scaffold,当键盘可见时,a 的总高度实际上会缩小。如果你不想要这个,你可以设置resizeToAvoidBottomInset它,像这样:

return Scaffold(
  resizeToAvoidBottomInset: false,
  // ...
  1. 您可以在小部件树中更早地访问文本比例因子。

如果您真的只想获取 MediaQuery 的文本比例因子,您可以在小部件树中更早地访问它,并将其保存为变量,然后将其传递给您喜欢的任何方式(提供者等):

final scaleFactor = MediaQuery.of(context).textScaleFactor;
print(scaleFactor);
  1. 如果你真的想删除viewInsets,你可以删除。MediaQuery

如果要删除viewInsets(或将其设置为固定值),可以通过MediaQuery在树上插入另一个来覆盖它:

return MediaQuery(
  data: MediaQuery.of(context).copyWith(
    viewInsets: EdgeInsets.zero,
  ),
  child: Container( /* always zero insets */ ),
);
  1. 重建应该不是问题。

最后,Flutter 小部件应该准备好随时重建,并且不应该引起任何问题。所以我假设你只是注意到你的小部件被重建是因为 Flutter Inspector,或者你print在构建方法中添加了一个,并注意到控制台中有一堆打印。除非您确实遇到了真正的性能问题,否则我不会太担心。但是,如果您的小部件在“意外时间”重建时表现不佳,您应该修复它,因为 Flutter 将一直重建您的小部件,而不仅仅是在键盘折叠时:D

于 2021-04-07T21:14:56.813 回答