【问题标题】:Passing data from stateless widget to Stateful widget将数据从无状态小部件传递到有状态小部件
【发布时间】:2021-08-29 03:45:40
【问题描述】:

我有这个带有数据的自定义类,它称之为无状态小部件,并且在有状态小部件中调用了无状态小部件,但不确定如何将数据传递给有状态小部件?

Model 
class ListOfIcon {
  String title;
  String imgurl;
  ListOfIcon({
    this.title,
    this.imgurl,
  });
}

数据:

final List<ListOfIcon> listoficons = [
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
];

无状态小部件:

class RowOFIcons extends StatelessWidget {
  final ListOfIcon listOfIcon;

  const RowOFIcons({
    Key key,
    this.listOfIcon,
  }) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return SliverToBoxAdapter(
      child: GridView.builder(
        itemCount: 6,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 4,
        ),
        itemBuilder: (BuildContext context, int index) {
          return Text(
            listOfIcon.title,
            style: TextStyle(
              color: Colors.white,
            ),
          );
        },
      ),
    );
  }
}

有状态的小部件:

class Profile extends StatefulWidget {
  @override
  _ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
  ScrollController _scrollController;
  double _scrolloffset = 0.0;

  @override
  void initState() {
    _scrollController = ScrollController()
      ..addListener(() {
        setState(() {
          _scrolloffset = _scrollController.offset;
        });
      });
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    final Size screenSize = MediaQuery.of(context).size;
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: Size(screenSize.width, 50.0),
        child: CustomAppBar(
          scrollOffset: _scrolloffset,
        ),
      ),
      body: CustomScrollView(
        controller: _scrollController,
        slivers: [
          SliverPadding(
            padding: const EdgeInsets.all(8.0),
            sliver: ProfilePhoto(),
          ),
          SliverPadding(
            padding: const EdgeInsets.all(8.0),
            sliver: RowOFIcons(
              listOfIcon: listoficons.,
            ),
          ),
        ],
      ),
    );
  }
}

您好,我有这个带有数据的自定义类,它称之为无状态小部件,而无状态小部件在有状态小部件中调用,但不确定如何将数据传递给有状态小部件?

【问题讨论】:

  • 您的意思是要将数据从子小部件传递到父小部件吗?
  • 没错,Parent 是有状态的 widget,child 是无状态的 widget(最初在 stateless widget 中调用数据)

标签: flutter dart


【解决方案1】:

您可以在构造函数中将数据传递给 StatefulWidget,就像将数据传递给无状态小部件一样。唯一的区别是您访问它的方式。例如:

class ExampleStateful extends StatefulWidget {
  // This widget accepts a title
  final String title;
  ExampleStateful({Key? key, required this.title}) : super(key: key);

  @override
  _ExampleStatefulState createState() => _ExampleStatefulState();
}

class _ExampleStatefulState extends State<ExampleStateful> {
  @override
  Widget build(BuildContext context) {
    return Container(
      // Accessing the title with widget.title
      child: Text(widget.title),
    );
  }
}

class ExampleStateless extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      // Passing the title as parameter
      child: ExampleStateful(
        title: 'Hello World :)',
      ),
    );
  }
}

观看我在代码中制作的 cmets。希望它有所帮助:)

【讨论】:

  • 谢谢你,亚尔。但我的问题是我在有状态小部件中调用了无状态小部件。我需要从有状态小部件中的无状态小部件访问数据。
  • 真的很感激,伙计。但不工作,所以我至少现在只是在无状态小部件中硬编码数据
【解决方案2】:

无状态小部件

class RowOFIcons extends StatelessWidget {
  final List<ListOfIcon> listoficons = [
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
  ListOfIcon(title: 'fsdf', imgurl: 'assets/images/p4.jpg'),
];

  @override
  Widget build(BuildContext context) {
    return SliverToBoxAdapter(
      child: GridView.builder(
        itemCount: 6,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 4,
        ),
        itemBuilder: (BuildContext context, int index) {
          return Text(
            listoficons[index].title,
            style: TextStyle(
              color: Colors.white,
            ),
          );
        },
      ),
    );
  }
}

有状态的小部件

class Profile extends StatefulWidget {
  @override
  _ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
  @override
  Widget build(BuildContext context) {
    final Size screenSize = MediaQuery.of(context).size;
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: Size(screenSize.width, 50.0),
        child: CustomAppBar(
          scrollOffset: _scrolloffset,
        ),
      ),
      body: RowOFIcons(),
    );
  }
}

【讨论】:

  • 谢谢你。但这不起作用,我的问题是有状态小部件不是无状态的
  • 我做了一些更改,现在应该可以使用了。
【解决方案3】:

我认为您正在寻找的是状态管理解决方案。了解它here

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2019-12-20
    • 2021-06-11
    • 1970-01-01
    • 2021-12-15
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多