【问题标题】:Pass StatefulWidget data to the State class without using constructor将 StatefulWidget 数据传递给 State 类而不使用构造函数
【发布时间】: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'),
      )
    );
  }
}

这很奇怪,因为变量不止两个,我不得不做很多工作。有没有更好的办法?

【问题讨论】:

    标签: dart flutter


    【解决方案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 构建存储在状态中。这与对象的命名方式完全相反。
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2021-10-17
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多