StatefulWidget里如何在构造函数里给textEditingController提供默认值?

新手上路,请多包涵

StatefulWidget里如何实现new时可传入一个textEditingController,若使用者没传入,则使用默认值?构造函数不让我写判断表达式,强迫我给constant。

同理,boraderRadius也是。

我自己想过一下,
我在SearchBox类中声明一个textEditingController,
然后在_SearchBoxState中再声明一个textEditingController,然后赋值

textEditingController = widget.textEditingController

但如果这样,就浪费了。

后面是这样使用的

dispose说不能为null,但是前面我想提供默认值又提供不了。

阅读 1.5k
1 个回答

如果您想在 StatefulWidget 的构造函数中给 TextEditingController 提供默认值,可以在构造函数中创建一个 TextEditingController 实例并给它提供默认值。然后您可以在 widget 的 build() 方法中使用该实例。例如:

class MyWidget extends StatefulWidget {
  MyWidget({Key key, this.defaultText}) : super(key: key);

  final String defaultText;

  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    // 在构造函数中创建 TextEditingController 并给它提供默认值
    _controller = TextEditingController(text: widget.defaultText);
  }

  @override
  Widget build(BuildContext context) {
    // 在 build() 方法中使用 TextEditingController
    return TextField(
      controller: _controller,
    );
  }
}

在上面的代码中,我们在 MyWidget 的构造函数中创建了一个 TextEditingController 实例并给它提供了默认值。然后在 MyWidget 的 build() 方法中,我们使用了该实例。

请注意,如果您在构造函数中创建了 TextEditingController,那么您也需要在 State 的 dispose() 方法中销毁它。例如:

@override
void dispose() {
  // 销毁 TextEditingController
  _controller.dispose();
  super.dispose();
}

这样做是为了避免内存泄漏。

推荐问题