繁体   English   中英

在顶层更新小部件时屏幕闪烁

[英]Screen Flickers when Updating Widget at Top Level

我将整个应用程序包装在一个 StateContainer 中,以便我可以从应用程序中的任何位置读取和写入某些变量。

main.dart

void main() {
  return runApp(new StateContainer(child: new MyApp()));
}

状态容器:

class StateContainer extends StatefulWidget { 
  final Widget child;
  final User user;

  StateContainer({
    @required this.child,
    this.user,
  });

  static StateContainerState of(BuildContext context) {
    return (context.dependOnInheritedWidgetOfExactType<UserData>()).data;
  }

  @override
  StateContainerState createState() => new StateContainerState();
}


class StateContainerState extends State<StateContainer> {
  User user;

  void updateUUID({uuid}) {
    if (user == null) {
      user = new User(uuid);
      setState(() {
        user = user;
      });
    } else {
      setState(() {
        user.uuid = uuid ?? user.uuid;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new UserID(
      data: this,
      child: widget.child,
    );
  } 
}

class User {
  String uuid;
  User(this.uuid);
}

class UserData extends InheritedWidget {
  final StateContainerState data;

  UserData({
    Key key,
    Widget child,
    @required this.data,
  }) : super(
          key: key,
          child: child,
        );

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) {
    return true;
  }

}

当我从孩子的 build 方法调用 updateUUID 时,我对为什么屏幕闪烁感到困惑,如下所示:

final container = StateContainer.of(context);
container.updateUUID('1234');

但是,我可以从 StateContainer 读取而不会导致闪烁,如下所示:

var uuid = container.user.uuid;

有没有办法可以防止这个屏幕闪烁,同时仍然能够从任何地方读/写变量?

我找到了使用 Provider(ChangeNotifierProvider 和 Consumer)的替代解决方案,如下所述: https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple

这可以防止屏幕闪烁。

如果您看到类似的错误

错误:在此消费者小部件上方找不到正确的提供者

尝试在小部件树中将 Provider / ChangeNotifierProvider 移到更高的位置。 我不得不将我的移动到最顶部以防止此错误,即使它似乎已经在使用它的小部件之上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM