一尘不染

不使用构造函数将StatefulWidget数据传递给State类

flutter

我设法通过构造函数将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'),
      )
    );
  }
}

太奇怪了,因为有两个以上的变量,所以我不得不做很多工作。有没有更好的办法?


阅读 673

收藏
2020-08-13

共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}'),
          )
        );
      }
    }
2020-08-13