Flutter 在上下文之外访问屏幕宽度
我正在为使用上下文之外的通知创建一个类,该类将在API错误等情况下调用。我需要留下一个相对于屏幕宽度的边距,但我没有这里的上下文。我可以传递上下文,这似乎不是最好的选择 所以我就这样结束了Flutter 在上下文之外访问屏幕宽度,flutter,flutter-layout,toast,flutter-web,Flutter,Flutter Layout,Toast,Flutter Web,我正在为使用上下文之外的通知创建一个类,该类将在API错误等情况下调用。我需要留下一个相对于屏幕宽度的边距,但我没有这里的上下文。我可以传递上下文,这似乎不是最好的选择 所以我就这样结束了 Function CustomToast (message) { return BotToast.showAttachedWidget( attachedBuilder: (_) => Align( alignment: Alignment.topRight,
Function CustomToast (message) {
return BotToast.showAttachedWidget(
attachedBuilder: (_) => Align(
alignment: Alignment.topRight,
child: Container(
margin: new EdgeInsets.only(top: 25, right: 25.0),
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
message,
),
),
),
),
duration: Duration(seconds: 20),
target: Offset(520, 520));
}
我需要将右边的边距设置为一个百分比。如何访问此处的屏幕宽度?没有上下文,这可能吗?任何建议都是受欢迎的,即使是对toast库的更改,也可能是应用程序级别的模型。一旦有了上下文,就可以设置屏幕分辨率,以便以后检索计算出的百分比。我经常使用这种方法
class ScreenInfoViewModel {
List<String> _setupCompleted = [];
String appName;
String packageName;
String version;
String buildNumber;
double screenWidth;
ScreenInfoViewModel() {
init();
}
init() async {
var packageInfo = await PackageInfo.fromPlatform();
appName = packageInfo.appName;
packageName = packageInfo.packageName;
version = packageInfo.version;
buildNumber = packageInfo.buildNumber;
}
bool _smallScreen = false;
bool _mediumScreen = false;
bool _largeScreen = false;
void setScreenSize(double this.screenWidth, double diagonalInches) {
_smallScreen = diagonalInches < 5.11;
_mediumScreen = !_smallScreen && diagonalInches <= 5.6;
_largeScreen = diagonalInches > 5.6;
}
bool get isSmallScreen => _smallScreen;
bool get isMediumScreen => _mediumScreen;
bool get isLargeScreen => _largeScreen;
String get screenSize {
String size = 'S';
if (_mediumScreen) size = 'M';
if (_largeScreen) size = 'L';
return size;
}
}
class ScreenInfoViewModel{
列表_setupCompleted=[];
字符串appName;
字符串封装名称;
字符串版本;
字符串号;
双屏宽;
ScreenInfoViewModel(){
init();
}
init()异步{
var packageInfo=等待packageInfo.fromPlatform();
appName=packageInfo.appName;
packageName=packageInfo.packageName;
version=packageInfo.version;
buildNumber=packageInfo.buildNumber;
}
bool_smallScreen=false;
bool _mediumScreen=false;
bool\u largeScreen=错误;
无效设置屏幕尺寸(双倍此屏幕宽度,双对角化){
_小屏幕=对角化<5.11;
_中等屏幕=!\u小屏幕和对角化5.6;
}
bool get isSmallScreen=>\u smallScreen;
bool get isMediumScreen=>\u mediumScreen;
bool-get-isLargeScreen=>\u-largeScreen;
字符串获取屏幕大小{
字符串大小='S';
如果(_mediumScreen)大小='M';
如果(_largeScreen)大小='L';
返回大小;
}
}
我这样使用它:
class SetupScreenInfo extends HookWidget {
// Use GetIt package to retrieve the model
final ScreenInfoViewModel _s = locator();
final _scaffoldKey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
/// This is the first 'context' with a MediaQuery, therefore,
/// this is the first opportunity to set these values.
/// widthPx and diagonalInches are from sized_context package.
_s.setScreenSize(context.widthPx, context.diagonalInches);
WidgetsBinding.instance.addPostFrameCallback((_) {
if (context == null) return;
Navigator.pushReplacementNamed(context, splashRoute);
});
return SafeArea(
child: Scaffold(
key: _scaffoldKey,
body: Material(color: Colors.yellow[300]),
),
);
}
}
class SetupScreenInfo扩展小部件{
//使用GetIt包检索模型
最终屏幕信息视图模型=定位器();
最终_scaffoldKey=新的GlobalKey();
@凌驾
小部件构建(构建上下文){
///这是第一个使用MediaQuery的“上下文”,因此,
///这是设置这些值的第一次机会。
///宽度px和对角化符来自上下文包。
_s、 设置屏幕尺寸(context.widthPx,context.diagonalInches);
WidgetsBinding.instance.addPostFrameCallback((){
if(context==null)返回;
pushReplacementNamed(上下文,splashRoute);
});
返回安全区(
孩子:脚手架(
钥匙:_scaffoldKey,
主体:材质(颜色:Colors.yellow[300]),
),
);
}
}
最后,SetupScreenInfo是我从MaterialApp开始的初始路线
此代码是我的生产代码的编辑,尚未经过测试,不是可运行的示例
希望这有助于产生一些想法