Flutter ScreenUtil 遇到的离奇bug

1,187 阅读1分钟

场景:

安卓机上在debug环境无报错,运行正常,在release环境下打包首页加载偶尔空白,在首页点击返回键和清除进程后再次打开,有几率首页加载空白!

IOS无异常;

技术环境:

    1、flutter + dart + redux    

    2、首页:PageView + BottomNavigationBar

官方示例ScreenUtil.init只需在home或者根路由(即第一个flutter页面)中调用一次即可。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter_ScreenUtil',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(title: 'FlutterScreenUtil Demo'),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    //设置尺寸(填写设计中设备的屏幕尺寸)如果设计基于360dp * 690dp的屏幕
    ScreenUtil.init(
        BoxConstraints(
            maxWidth: MediaQuery.of(context).size.width,
            maxHeight: MediaQuery.of(context).size.height),
        designSize: Size(360, 690),
        orientation: Orientation.portrait);
    return Scaffold();
  }
}

发现问题:在项目的根目录初始化

Widget buildView(MainState state, Dispatch dispatch, ViewService viewService) {  initScreenUtil(viewService.context);  return Scaffold(

initScreenUtil 初始化之后,在首页的Widget中,外部引用的Widget里面使用ScreenUtil中的方法报错,场景如下

Widget _body(LoginState state, Dispatch dispatch) {  return SingleChildScrollView(    reverse: true,    child: LoginView(        state: state,        onUserName: (String msg) {          //用户名          dispatch(LoginActionCreator.observeUserName(msg));        },

//LoginView
@override  Widget build(BuildContext context) {    return GestureDetector(      behavior: HitTestBehavior.translucent,      onTap: () {        FocusScope.of(context).requestFocus(          FocusNode(),        );      },      child: Container(        padding: EdgeInsets.only(          top: auto(72),          left: auto(40),          right: auto(40),        ),        child: _login(),      ),    );   }

解决问题

暂时将initScreenUtil初始化放入到报错的widget的根节点下,打包后便不会出问题

问题分析

暂时没有深入分析,可能跟Widget build的过程和渲染有关,先记录一下,后续再深入。