低帧率抖动

时间:2019-06-26 15:21:33

标签: performance flutter

启动speed_dial动画插件时,我看到帧速率UI线性下降。当我在此处添加sharedpref函数时出现问题:

 @override
  Widget build(BuildContext context) {
   sharedpref_function();
    return Scaffold(

即使sharedpref为空,也要监听保存的值,我会遇到这种情况。

经过10分钟甚至什么都不做之后,当我调用_renderSpeedDial时,我测量为1120ms /帧

这是完整的代码:

  bool _dialVisible = true;
  Color _speedDial =  Colors.pink;

  sharedpref_function() async {     
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
    }
   );
  }

  _renderSpeedDial() {
    return SpeedDial(
      animatedIcon: AnimatedIcons.add_event,
      animatedIconTheme: IconThemeData(size: 22.0),
      backgroundColor: _speedDial,
      // child: Icon(Icons.add),
      /*  onOpen: () => print('OPENING DIAL'),
      onClose: () => print('DIAL CLOSED'),*/
      visible: _dialVisible,
      curve: Curves.bounceIn,
      children: [

        SpeedDialChild(
          child: Icon(Icons.fullscreen_exit, color: Colors.white),
          backgroundColor: Color(0xffa088df),
          onTap: () {
            setState(() {

            });
          },
          label: '1',
          labelStyle: TextStyle(fontWeight: FontWeight.w500,color: Colors.white),
          labelBackgroundColor:Color(0xffa088df),
        ),

      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    sharedpref_function(); // here the sharedpref I use to listen saved value
    return Scaffold(
  body: Stack(
      children: <Widget>[
    Padding
      (
      padding: const EdgeInsets.only(right:10.0, bottom:10.0),
      child:
      _renderSpeedDial(),
    ),
      ],
)
);
  }
}

1 个答案:

答案 0 :(得分:2)

您的 sharedpref_function()方法在您的 build 方法中被调用。完全不建议这样做,因为它将在需要重建UI的每一帧上调用,并且在其中具有动画的代码将以60fps的速度(在每一帧上)调用。

initState didChangeDependencies 中移动方法(还有更多的方法被调用过一次或几次,如 didChangeDependencies )。

当您需要更新值时,可以在 onTap 手势中完成操作。

还要在--release(发布模式)下测试您的应用,以真正测试您的应用速度。