【问题标题】:How to use stateful widget parameters in state class at construction without adding the widget to the tree?如何在构造时在状态类中使用有状态的小部件参数而不将小部件添加到树中?
【发布时间】:2021-10-29 13:00:13
【问题描述】:

我遇到了一个问题,即在构造它的状态类时我需要在其状态类中使用 StatefulWidget 参数,但由于在状态的类构造函数中使用 widget.[whatever variable name] 会返回意外的空值,因此我找不到方法来执行此操作,并且 initState 函数仅在小部件被绘制到屏幕时运行。

例如:

import 'package:flutter/material.dart';

class Test extends StatefulWidget {
  final String text;
  Test(this.text);

  final state = _TestState();
  @override
  _TestState createState() => state;
}

class _TestState extends State<Test> {
  String? changingText;

  void updateChangingText(String moreText){
      changingText = changingText! + moreText;
  }

  @override
  void initState() {
    super.initState();

    changingText = widget.text;
  }

  @override
  Widget build(BuildContext context) {
    return Text(changingText!);
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var w = Test('test');
    w.state.updateChangingText(' text');

    return MaterialApp(home: Scaffold(body: 
      Test('test text')
    ));

  }
}

void main() {
  runApp(App());
}

这不起作用,因为在 initState 为其提供初始值之前正在更新 changedText,因为它仅在将文本绘制到屏幕上时运行,并且:

导入'package:flutter/material.dart';

class Test extends StatefulWidget {
  final String text;
  Test(this.text);

  final state = _TestState();
  @override
  _TestState createState() => state;
}

class _TestState extends State<Test> {
  String? changingText;

  void updateChangingText(String moreText){
      changingText = changingText! + moreText;
  }

  _TestState(){
    changingText = widget.text;
  }

  @override
  Widget build(BuildContext context) {
    return Text(changingText!);
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var w = Test('test');
    w.state.updateChangingText(' text');

    return MaterialApp(home: Scaffold(body: 
      Test('test text')
    ));

  }
}

void main() {
  runApp(App());
}

也不起作用,因为您不能在状态类构造函数中使用 widget.[whatever](出于某种原因)。

那么,在将小部件绘制到屏幕之前,如何在状态类中使用小部件参数?

提前感谢您的帮助

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您应该为此使用 State 中存在的 initState 方法而不是构造函数

    @override
    void initState() {
      changingText = widget.text;
      super.initState();
    }
    

    【讨论】:

    • 如上所述,这在我的情况下不起作用,因为仅在将小部件添加到树时才调用 initState。而且我可能像上面的例子一样想要在将小部件绘制到屏幕之前使用“widget.***”参数
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2019-12-20
    • 2021-05-19
    • 2021-08-27
    • 2020-08-06
    • 2021-08-29
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多