将 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 类而不使用构造函数的主要内容,如果未能解决你的问题,请参考以下文章

jQuery $.ajax(),将成功数据传递给单独的函数

如何将数据传递给BottomSheetDialogFragment [重复]

如何通过数组将数据传递给表格视图?

为啥 Ajax 将“未定义”数据传递给 MySql?

将异步获取的数据传递给子道具

Primeng - 对话服务将数据传递给对话组件