将 StatefulWidget 数据传递给 State 类而不使用构造函数
Posted
技术标签:
【中文标题】将 StatefulWidget 数据传递给 State 类而不使用构造函数【英文标题】:Pass StatefulWidget data to the State class without using constructor 【发布时间】:2018-10-29 22:06:59 【问题描述】:我设法通过如下构造函数将 Stateful 类变量的值传递给 State 类:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
title: 'Demo',
home: MyHomePage('John', 'Morison'),
);
class MyHomePage extends StatefulWidget
MyHomePage(this.fname, this.lname);
final String fname;
final String lname;
@override
_MyHomePageState createState() => _MyHomePageState(fname, lname);
class _MyHomePageState extends State<MyHomePage>
_MyHomePageState(this.fname, this.lname);
final String fname;
final String lname;
@override
Widget build(BuildContext context)
return Scaffold(
body: Center(
child: Text('Hello $fname $lname'),
)
);
这很奇怪,因为变量不止两个,我不得不做很多工作。有没有更好的办法?
【问题讨论】:
【参考方案1】:是的,有widget
:
来自文档:
/// The current configuration. /// /// A [State] object's configuration is the corresponding [StatefulWidget] /// instance. This property is initialized by the framework before calling /// [initState]. If the parent updates this location in the tree to a new /// widget with the same [runtimeType] and [Widget.key] as the current /// configuration, the framework will update this property to refer to the new /// widget and then call [didUpdateWidget], passing the old configuration as /// an argument. T get widget => _widget; T _widget;
代码应如下所示:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
title: 'Demo',
home: MyHomePage('John', 'Morison'),
);
class MyHomePage extends StatefulWidget
MyHomePage(this.fname, this.lname);
final String fname;
final String lname;
@override
_MyHomePageState createState() => _MyHomePageState();
class _MyHomePageState extends State<MyHomePage>
@override
Widget build(BuildContext context)
return Scaffold(
body: Center(
child: Text('Hello $widget.fname $widget.lname'),
)
);
【讨论】:
我一点也不明白。您将状态存储在小部件中,并将 UI 构建存储在状态中。这与对象的命名方式完全相反。以上是关于将 StatefulWidget 数据传递给 State 类而不使用构造函数的主要内容,如果未能解决你的问题,请参考以下文章