代码之家  ›  专栏  ›  技术社区  ›  Blasanka

不使用构造函数将statefulwidget数据传递到状态类

  •  3
  • Blasanka  · 技术社区  · 6 年前

    我设法通过如下的构造函数将状态类变量的值传递给状态类:

    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 回复  |  直到 5 年前
        1
  •  6
  •   Blasanka    6 年前

    是的,有 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}'),
          )
        );
      }
    }