【问题标题】:Flutter passing data up through stateless widgetFlutter 通过无状态小部件向上传递数据
【发布时间】:2020-05-06 17:07:27
【问题描述】:

我正在开发一个颤振应用程序,并且我有一些数据存储在小部件的状态中。在这种情况下,它是字符串标题。我想知道是否可以将这些数据通过父无状态小部件传递到这个无状态小部件父级,这是一个有状态小部件。如果工作正常,我可以将标题传递到 MyHomePage 的状态并将其保存到 title2。有没有办法做到这一点,或者我必须将 Widget1 转换为有状态的小部件。唯一的问题是我已经编写了小部件,但我很好奇。这是我的代码。谢谢!

//main.dart
import 'package:flutter/material.dart';
import 'Widget1.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),

        home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {

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

class _MyHomePageState extends State<MyHomePage> {
String title2;
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text("Hello"),
      ),
      body: Center(
        child: Widget1(),
      ),
    );
  }
}
/////////////////////////////////////////////
//Widget1.dart

Widget Widget1() {
  return Widget2();
}
/////////////////////////////////
//Widget2.dart

import 'package:flutter/material.dart';

class Widget2 extends StatefulWidget {

  final String title = "Hello from Widget2";


  _Widget2State createState() => _Widget2State();
}

class _Widget2State extends State<Widget2> {
String title = "Hello from Widget2";


  @override
  Widget build(BuildContext context) {
    return Text('${title}');

  }
}

再次感谢!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    如果您没有使用除默认状态管理之外的任何状态管理,那么您可以使用 Navigator 在小部件之间传递数据。这是如何将 String 从子无状态小部件(也可以是有状态的)传递到其父小部件的代码示例。

    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      String title = "";
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("FIRST WIDGET"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text("Title from child Stateless widget: $title"),
                FlatButton(
                  onPressed: () => _openSecondWidget(),
                  child: Text("OPEN SECOND WIDGET"),
                )
              ],
            ),
          ),
        );
      }
    
      void _openSecondWidget() async {
        var newTitle = await Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => SecondWidget(),
          ),
        );
        setState(() {
          title = newTitle;
        });
      }
    }
    
    class SecondWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("SECOND WIDGET"),
          ),
          body: Center(
            child: FlatButton(
              onPressed: () {
                Navigator.of(context).pop("Hi from Second Widget");
              },
              child: Text("GO BACK"),
            ),
          ),
        );
      }
    }
    

    因此,第一个小部件上的按钮正在将新小部件推送到屏幕上并等待其结果。当它从第二个小部件获得结果时,我正在使用 setState 更新标题变量的显示。第二个小部件只有一个按钮,它使用一些参数从后台堆栈中删除这个小部件,在这种情况下是字符串,但它可以是其他任何东西。

    【讨论】:

    • 嗨@Antonio Valentic。谢谢你的协助。我离我的电脑大约有 30 分钟的路程,但我一回来就会检查
    • 感谢@Antonio Valentic!我实际上只是要将它转换为有状态的小部件,因为这样会更容易,但这就是我正在寻找的答案!
    • @Matt123 很高兴我能帮上忙。
    【解决方案2】:

    我假设您只想将数据从 StatelessWidget 传递到 StatefulWidget 并希望在其 State 中访问它。那就试试这个,

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: "Flutter Demo",),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      final String title;
    
      const MyHomePage({Key key, this.title}) : super(key: key);
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title), //TODO: use `widget` to access properties
          ),
          body: Center(
            child: MyWidget(title: widget.title,),
          ),
        );
      }
    }
    
    class MyWidget extends StatefulWidget {
      final String title;
    
      const MyWidget({Key key, this.title}) : super(key: key);
    
      _MyWidgetState createState() => _MyWidgetState();
    }
    
    class _MyWidgetState extends State<MyWidget> {
      @override
      Widget build(BuildContext context) {
        return Text('${widget.title}');
      }
    }
    

    【讨论】:

    • 嗨@Crazy懒猫。非常感谢你帮助我。不幸的是,另一个答案是我想要的更多,但我真的很感激!
    猜你喜欢
    • 2021-08-29
    • 2021-01-22
    • 2021-01-27
    • 2019-12-28
    • 2019-08-29
    • 1970-01-01
    • 2022-01-16
    • 2020-12-01
    相关资源
    最近更新 更多