简体   繁体   English

Flutter 通过无状态小部件向上传递数据

[英]Flutter passing data up through stateless widget

I am working on a flutter app, and I have some data stored in the state of a widget.我正在开发一个颤振应用程序,我有一些数据存储在小部件的状态中。 In this case it is the string title.在这种情况下,它是字符串标题。 I am wondering if I can pass this data through a parent stateless widget and into this stateless widgets parent, which is a stateful widget.我想知道我是否可以通过父无状态小部件将此数据传递到这个无状态小部件父级,这是一个有状态小部件。 If working correctly, I could pass title into the state of MyHomePage and save it into title2.如果工作正常,我可以将标题传递到 MyHomePage 的状态并将其保存到 title2。 Is there a way to do this or do I have to convert Widget1 into a stateful widget.有没有办法做到这一点,或者我是否必须将 Widget1 转换为有状态的小部件。 The only issue with that is that I already wrote the widget, but I am curious.唯一的问题是我已经编写了小部件,但我很好奇。 Here is my code.这是我的代码。 Thanks!谢谢!

//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}');

  }
}

Thanks again!再次感谢!

If you are not using any state management except default one then you can pass data between widgets using Navigator.如果您没有使用除默认状态管理之外的任何状态管理,那么您可以使用 Navigator 在小部件之间传递数据。 Here is the code example of how to pass String from child Stateless widget (can be stateful too) to its parent widget.这是如何将 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"),
        ),
      ),
    );
  }
}

So the button on the first widget is pushing new widget on the screen and awaits for its result.所以第一个小部件上的按钮正在屏幕上推送新的小部件并等待其结果。 When it gets the result from the second widget I'm using setState updating display of the title variable.当它从第二个小部件获得结果时,我正在使用 setState 更新标题变量的显示。 And second widget has just one button which removes this widget from the back stack with some parameter which is in this case String, but it can be anything else.第二个小部件只有一个按钮,它使用一些参数从返回堆栈中删除这个小部件,在这种情况下是字符串,但它可以是其他任何东西。

I assume you just want to pass data from StatelessWidget to StatefulWidget and want to access it in its State .我假设您只想将数据从StatelessWidget传递到StatefulWidget并希望在其State访问它。 Then try this,那就试试这个

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}');
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM