【问题标题】:LateInitializationError: Field 'controller' has not been initializedLateInitializationError:字段 \'controller\' 尚未初始化
【发布时间】:2023-01-31 03:26:26
【问题描述】:

我在 SideBarWidget() 中使用 SideBar() 小部件并在我的主屏幕 SideBarScreen() 中使用它 但我无法在 Sidebar() 小部件中初始化 controller...我该如何解决这个问题

侧边栏_屏幕

class _SideBarScreenState extends State<SideBarScreen> {

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Stack(
        children: [
          ScaffoldScreen(
            iconButton: IconButton(
              onPressed: () {SideBarWidget().toggle();},
              icon: kScaffoldScreenButtonIcon,
            ),
          ),
          SideBarWidget(),
        ],
      ),
    );
  }
}

侧边栏小部件

class SideBarWidget extends StatelessWidget {
  SideBarWidget({Key? key}) : super(key: key);

  void toggle() {
    SideBarState().toggle();
  }

  late final SideBar sideBarWidget = SideBar();

  @override
  Widget build(BuildContext context) {
    return sideBarWidget;
  }
}

侧边栏

class SideBar extends StatefulWidget {}

class SideBarState extends State<SideBar> with SingleTickerProviderStateMixin{
  late AnimationController controller;
  late Animation<Offset> _offsetAnimation;

  @override
  void initState() {
    super.initState();

    controller = AnimationController(vsync: this, duration: const  Duration(seconds: 2));

    _offsetAnimation = Tween<Offset>(
      begin: const Offset(-1.0, 0.0),
      end: const Offset(0.0, 0.0),
    ).animate(CurvedAnimation(parent: controller, curve: Curves.easeOut));
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  void toggle() {
    if (controller.isCompleted) {
      controller.reverse();
    }
    else {controller.forward();}
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition();
  }
}

这给出了错误LateInitializationError:字段“控制器”尚未初始化。

我尝试将 controller 作为参数传递给 SideBar() 但它发出异常:此小部件已被卸载,因此 State 不再具有上下文(并且应被视为已失效)。

【问题讨论】:

  • 你如何在 SideBar Widget 类中调用 toggle ?
  • @eamirho3ein 我使用 SideBarState().toggle(); 我可以使用它因为 SIdeBar 的状态不是私有的

标签: flutter dart controller initialization


【解决方案1】:

问题是您每次调用SideBarWidget().toggle() 时都会创建SideBar 的新实例。相反,您应该使用 SideBar 的相同实例,以便保留状态。

class SideBarWidget extends StatelessWidget {
  SideBarWidget({Key? key}) : super(key: key);

  final sideBar = SideBar();

  void toggle() {
    sideBar.state.toggle();
  }

  @override
  Widget build(BuildContext context) {
    return sideBar;
  }
}

所以现在你每次都使用相同的SideBar实例,你不需要传递任何参数。


笔记:

要像这样使用,您还需要将 SideBar 类更改为 StatefulWidget

class SideBar extends StatefulWidget {
  @override
  _SideBarState createState() => _SideBarState();
}

【讨论】:

  • 我无法获得 .state 方法...:(
  • 您需要将 Sidebar 类转换为有状态的
  • @PulinaHansana 我已经编辑了我的答案,看看它并@override createState 方法
  • SideBar 类是有状态的。但它的状态不是私有的。不影响吧?
  • 你有没有覆盖 createState
猜你喜欢
  • 1970-01-01
  • 2022-07-27
  • 2021-10-27
  • 2021-12-29
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多