如何将数据从 StatelessWidget 传递到 StatefulWidget?

Posted

技术标签:

【中文标题】如何将数据从 StatelessWidget 传递到 StatefulWidget?【英文标题】:How to pass data from StatelessWidget to Statefulwidget? 【发布时间】:2020-10-30 23:27:02 【问题描述】:

我正在尝试将数据从 StatelessWidget 传递到 StatefulWidget,但无法这样做。 尝试了各种选项,但还没有成功

下面是StatelessWidget的代码

class ListFieldsForm2 extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return BlocProvider(
      create: (context) => ListFieldFormBloc2(),
      child: Builder(
        builder: (context) 
          final formBloc = context.bloc<ListFieldFormBloc2>();

          return Theme(
            data: Theme.of(context).copyWith(
              inputDecorationTheme: InputDecorationTheme(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(20),
                ),
              ),
            ),
            child: Scaffold(
              resizeToAvoidBottomInset: false,

              floatingActionButton: FloatingActionButton(
                onPressed: formBloc.submit,
                child: Icon(Icons.send),
              ),
              body: FormBlocListener<ListFieldFormBloc2, String, String>(
                onSubmitting: (context, state) 
                  //LoadingDialog.show(context);
                ,
                onSuccess: (context, state) 

                  int u;

                  String copyrights;

                  String name1;

                  var parsedData = json.decode(state.successResponse);
                  List members = parsedData['members'];
                  members.forEach((member)

                    name1 = member['firstName'];
                    
                    List<String> _firstNames = [];
                    _firstNames.add(member["firstName"]);


                  );



                  MyHomePage().steps = members;
                  Navigator.pop(context);
                 
                ,
                onFailure: (context, state) 


                  Scaffold.of(context).showSnackBar(
                      SnackBar(content: Text(state.failureResponse)));
                ,
                
              ),
            ),
          );
        ,
      ),
    );
  

我尝试了MyHomePage().steps = members; 和 'MyHomePage(steps: members);',但我仍然在 StatefulWidget 中收到空值

我应该如何传递数据?

【问题讨论】:

【参考方案1】:

这是您想要达到的目标吗?使用回调函数为您创建了一个示例示例:

import 'package:flutter/material.dart';

void main() => runApp(HomePage());

class HomePage extends StatefulWidget 
  HomePage(Key key) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage> 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: SecondPage(
            callback: (value) 
              print(value);
            ,
          ),
        ),
      ),
    );
  


typedef void StringCallback(String val);

class SecondPage extends StatelessWidget 
  final StringCallback callback;
  const SecondPage(Key key, this.callback) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return GestureDetector(
      onTap: () 
        callback('This is a sample text');
      ,
      child: Center(
        child: Container(
          child: Text('press'),
        ),
      ),
    );
  



只要看看,让我知道这是否是你想要的。

【讨论】:

您只提供了一个无状态小部件,您可以提供另一个小部件,以便我可以告诉您可以做什么。 (我们将不胜感激完整的示例,以便我们知道您想要实现的目标)。【参考方案2】:

试试这个

首页

RaisedButton(
              child: const Text('Send Data'),
              onPressed: () 
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => Testing(todos: "Hello",),
                  ),
                );
           
              ,
            ),

第二页

class Testing extends StatefulWidget 
  String todos;
  Testing(Key key, @required this.todos) : super(key: key);

  @override
  _TestingState createState() => _TestingState();


class _TestingState extends State<Testing> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(),
      body: Center(child: Text(widget.todos)),
    );
  

【讨论】:

【参考方案3】:

Mark Davids试试这个:

Navigator.pop(context, members);

从您的推送代码中获取数据:

final members = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => ListFieldsForm2()),
    );

【讨论】:

【参考方案4】:

在 StatelessWidget 中创建一个回调函数(它将返回您要传递的数据)并通过构造函数将其传递给另一个小部件

【讨论】:

我尝试了很多东西,请您举例说明

以上是关于如何将数据从 StatelessWidget 传递到 StatefulWidget?的主要内容,如果未能解决你的问题,请参考以下文章

将地图数据从 API 传递到多个屏幕?

如何从 StatelessWidget 中的 StatefulWidget 访问变量?

如何在 StatelessWidget 的任何函数中获取上下文?

在 Flutter 中,如何将数据传递给 Stateless Widget?

如何在 StatelessWidget 中更改 StatefulWidget 的状态?

调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始