簡體   English   中英

LateInitializationError:字段“控制器”尚未初始化

[英]LateInitializationError: Field 'controller' has not been initialized

我在 SideBarWidget() 中使用SideBar()小部件並在我的主屏幕SideBarScreen() SideBarWidget()使用它,但我無法在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: Field 'controller' has not been initialized。

我嘗試將controller作為參數傳遞給SideBar()但它給出了一個異常:此小部件已被卸載,因此 State 不再具有上下文(並且應被視為已失效)。

問題是每次調用SideBarWidget().toggle()時都會創建一個新的SideBar實例。 相反,您應該使用SideBar的相同實例,以便保留 state。

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 class 更改為StatefulWidget

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM