场景:
安卓机上在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的过程和渲染有关,先记录一下,后续再深入。