Flutter 在上下文之外访问屏幕宽度

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,

我正在为使用上下文之外的通知创建一个类,该类将在API错误等情况下调用。我需要留下一个相对于屏幕宽度的边距,但我没有这里的上下文。我可以传递上下文,这似乎不是最好的选择

所以我就这样结束了

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开始的初始路线

此代码是我的生产代码的编辑,尚未经过测试,不是可运行的示例

希望这有助于产生一些想法