【问题标题】:How to save Mediaquery Size in a separate file in flutter?如何将Mediaquery Size保存在flutter中的单独文件中?
【发布时间】:2022-01-11 13:17:16
【问题描述】:
我想将每个按钮和容器大小保存为 mediaquery,如下所示在单独的 dart 文件中。
class FrameSize{
var SliderHeight = MediaQuery.of(context).size.height / 6;
var addToCartButtonHeight = MediaQuery.of(context).size.height / 14;
}
所以我可以在任何我想要的地方打电话给他们,并在一个地方进行更改。这可能吗??
【问题讨论】:
标签:
flutter
flutter-layout
media-queries
【解决方案1】:
是的,但你需要像单例这样的东西。我曾经实现Get it 来实现这一点。很简单,创建一个文件(你可以给它任何你想要的名字),我习惯叫它appData,像这样:
class AppData {
var isAuthenticated = false;
User user;[...] you can place whathever you want
}
一个名为 locator.dart 的文件(再一次,随意命名):
import 'package:get_it/get_it.dart';
GetIt locator = GetIt.instance;
void setupLocator() {
locator.registerLazySingleton(() => AppData());
[...] you can place oher singletons too
}
在你的 main.dart 中放置这个:
setupLocator();
在您调用 runApp() 之前的主页开始...
现在,当您想使用数据时,您只需这样做:
class DocumentBloc extends BaseBloc (im a big fan of bloc "pattern") {
var appData = locator.get<AppData>();
//... photo = appData.user.photo;
//... locator.get<AppData>().user.photo works too...
}
【解决方案2】:
这可能会有所帮助:
1)创建类:
import 'package:flutter/widgets.dart';
class FrameSize {
//init method is static so no object creation is required
static void init({
required context,
}) {
//instantiate variables here
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData.size.width;
screenHeight = _mediaQueryData.size.height;
_safeAreaHorizontal =
_mediaQueryData.padding.left + _mediaQueryData.padding.right;
_safeAreaVertical =
_mediaQueryData.padding.top + _mediaQueryData.padding.bottom;
sliderHeight = screenHeight / 6;
addToCartButtonHeight = screenHeight / 14;
}
//declare variables here
static late MediaQueryData _mediaQueryData;
static late double screenWidth;
static late double screenHeight;
static late double _safeAreaHorizontal;
static late double _safeAreaVertical;
static late double sliderHeight;
static late double addToCartButtonHeight;
}
2)在您的主屏幕中实例化它(不要忘记)。
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
FrameSize.init(context);
…
}
}
3)最后,使用它来设置小部件的尺寸。
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
MySlider(
height: FrameSize.sliderHeight,
...
),
AddToCartButton(
height: FrameSize.addToCartButtonHeight,
...
),
],
);
}
您也可以参考this article。