如何将对象传递给另一个构建中的 StatefulWidget?

问题描述 投票:0回答:1

我目前正在测试如何实现一个仪表板页面,我在其中使用多个 StatefulWidget 制作一个页面,以便以后维护相当容易。我已经知道如何在 StatefulWidget 之间传递对象,但在将同一对象传递到另一个 StatefulWidget 构建内部的 StatefulWidget 时遇到问题。我在传递给子 StatefulWidget 的对象上收到一条错误消息“无效常量值”。我尝试更改子 StatefulWidget 的构造函数,例如删除对象参数所需的参数或使构造函数不是常量,但它会导致该小部件出现其他类型的错误。现在,使用我当前的代码,我收到一条错误消息“错误:未定义名称‘小部件’。”在 ShippingDocPage(user: widget.user) 行上。支架主体的 widget 变量会消失吗?

这是我的代码:

class DashboardPage extends StatefulWidget {
  final User user;

  const DashboardPage({super.key, required this.user});

  @override
  State<DashboardPage> createState() => _DashboardPageState();
}

class _DashboardPageState extends State<DashboardPage> {
  var appBarTitleText = Text("Dashboard");

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        appBar: AppBar(
          bottom: const TabBar(
            tabs: [
              Tab(text: 'Tab1'),
              Tab(text: 'Tab2'),
              Tab(text: 'Tab3'),
            ],
          ),
          title: Text(widget.user.userType!.displayName),//this works just fine
        ),
        body: Column(
          children: [
            Container(
              height: 150,
              child: const Text('Vehicle Replace'),
            ),
            Container(
              height: 150,
              child: const TabBarView(
                children: [
                  ShippingDocPage(user: widget.user),//this is where the error shows
                  Icon(Icons.directions_transit),
                  Icon(Icons.directions_bike),
                ],
              ),
            ),
          ],
        ),
      )
    );
  }
}

然后这是“子”StatefulWidget:

class ShippingDocPage extends StatefulWidget {
  final User user;

  const ShippingDocPage({super.key, required this.user});


  @override
  State<ShippingDocPage> createState() => _ShippingDocPageState();
}

class _ShippingDocPageState extends State<ShippingDocPage> {

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            title: Text('Shipping Documents'),
          ),
          body: Column(
            children: [
              Container(
                height: 150,
                child: Text(widget.user.userType!.displayName),
              ),
            ],
          ),
        )
    );
  }
} 
flutter statefulwidget
1个回答
0
投票
    class DashboardPage extends StatefulWidget {
  final User user;

  const DashboardPage({super.key, required this.user});

  @override
  State<DashboardPage> createState() => _DashboardPageState();
}

class _DashboardPageState extends State<DashboardPage> {
  var appBarTitleText = Text("Dashboard");

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        appBar: AppBar(
          bottom: const TabBar(
            tabs: [
              Tab(text: 'Tab1'),
              Tab(text: 'Tab2'),
              Tab(text: 'Tab3'),
            ],
          ),
          title: Text(widget.user.userType!.displayName), // This works just fine
        ),
        body: Column(
          children: [
            Container(
              height: 150,
              child: const Text('Vehicle Replace'),
            ),
            Container(
              height: 150,
              child: TabBarView(
                children: [
                  ShippingDocPage(user: widget.user), // Remove const here
                  Icon(Icons.directions_transit),
                  Icon(Icons.directions_bike),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class ShippingDocPage extends StatefulWidget {
  final User user;

  const ShippingDocPage({super.key, required this.user});

  @override
  State<ShippingDocPage> createState() => _ShippingDocPageState();
}

class _ShippingDocPageState extends State<ShippingDocPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shipping Documents'),
      ),
      body: Column(
        children: [
          Container(
            height: 150,
            child: Text(widget.user.userType!.displayName),
          ),
        ],
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.