Flutter 在flatter中,如何将数据传递到无状态小部件中?

Flutter 在flatter中,如何将数据传递到无状态小部件中?,flutter,statelesswidget,flutter-widget,Flutter,Statelesswidget,Flutter Widget,我正在尝试构建我的第一个flatter应用程序,在将数据传递到无状态小部件时遇到了困难。我有以下课程: class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'App Title', theme: new ThemeData( primarySwatch: Colo

我正在尝试构建我的第一个flatter应用程序,在将数据传递到无状态小部件时遇到了困难。我有以下课程:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'App Title',
      theme: new ThemeData(
        primarySwatch: Colors.green,
      ),
      home: new MainBody(),
    );
  }
}


class MainBody extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Padding(
        padding: const EdgeInsets.only(left: 20.0, right: 20.0),
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new TimeCheck(),
          ],
        ),
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“应用程序标题”,
主题:新主题数据(
主样本:颜色。绿色,
),
主页:新主体(),
);
}
}
类MainBody扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
车身:新衬垫(
填充:仅限常量边集(左:20.0,右:20.0),
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新建时间检查(),
],
),
),
);
}
}
TimeCheck
是一个有状态的小部件。基本上,我希望能够在开始时设置一些值,然后通过
MainBody
将它们传递到
TimeCheck
。我读到的每一篇文章都显示了如何将数据传递到有状态的小部件中,但是有可能通过无状态的小部件传递数据吗

我认识到我可能采取了错误的方法,因此如果有帮助,我最终想做的是有一个“设置”页面,用户可以在其中设置数据的值(一个字符串和一些数字),然后将这些值传递到
TimeCheck
,在那里它们用于生成显示


如果可能的话,我还希望能够保存用户设置的值,这样他们就不必每次都输入它们,然后我希望能够在实例化
TimeCheck
时读入它们。

是的,您只需将信息传递给构造函数即可。大概是这样的:

 class MyApp extends StatelessWidget {
  MyApp(this.yourData);

  final int yourData;
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'App Title',
      theme: new ThemeData(
        primarySwatch: Colors.green,
      ),
      home: new MainBody(yourData),
    );
  }
}


class MainBody extends StatelessWidget {
  MainBody(this.yourData);

  final int yourData;

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Padding(
        padding: const EdgeInsets.only(left: 20.0, right: 20.0),
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new TimeCheck(yourData),
          ],
        ),
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
MyApp(this.yourData);
最终数据;
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“应用程序标题”,
主题:新主题数据(
主样本:颜色。绿色,
),
主页:新主体(yourData),
);
}
}
类MainBody扩展了无状态小部件{
主体(this.yourData);
最终数据;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
车身:新衬垫(
填充:仅限常量边集(左:20.0,右:20.0),
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新时间检查(您的数据),
],
),
),
);
}
}

为此,我们创建了一个
无状态小部件。我们称之为脱屏。由于此页面的内容在运行时不会更改,因此我们需要此小部件范围内的TODO列表

我们将
ListView.builder
作为返回到
build()
的小部件的主体传入。这会将列表呈现到屏幕上,以便您继续

class TodosScreen extends StatelessWidget {
  final List<Todo> todos;

  //requiring the list of todos
  TodosScreen({Key key, @required this.todos}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Todos'),
      ),
      //passing in the ListView.builder
      body: ListView.builder(
        itemCount: todos.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(todos[index].title)
          );
        },
      ),
    );
  }
}
导航并将数据传递到详细信息屏幕

有了
DetailScreen
,您就可以执行导航了。在本例中,当用户点击列表中的待办事项时,导航到
DetailScreen
。将todo传递到Detail屏幕

ListView.builder(
  itemCount: todos.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(todos[index].title),
      // When a user taps the ListTile, navigate to the DetailScreen.
      // Notice that you're not only creating a DetailScreen, you're
      // also passing the current todo to it.
      onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => DetailScreen(todo: todos[index]),
          ),
        );
      },
    );
  },
);

有关更多信息,请参见

简易说明:

class MainMenuCard extends StatelessWidget {
final Choice choice;
final int index;

const MainMenuCard({Key key, this.choice, this.index, Choice Choice, int int})
  : super(key: key);
 
然后像这样打电话

MainMenuCard(choice : choices[index],int: index)
“选择”是一个模型类(当我们与List.generate一起使用时),否则您可以轻松地传递数据

 final Choice choice;
 const List<Choice> choices = const <Choice>[]
最终选择;
常量列表选项=常量[]

谢谢,这就解决了问题!如何将“yourData”变量传递给填充值而不是20.0?Dart说这不是一个常数。
 final Choice choice;
 const List<Choice> choices = const <Choice>[]