#flutter #dart
Вопрос:
Я столкнулся с проблемой, когда мне нужно использовать параметр 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());
}
Это не работает, так как changingText обновляется до того, как initState присвоит ему начальное значение, поскольку он запускается только тогда, когда текст выводится на экран, и это:
импорт ‘упаковка:флаттер/материал.дротик’;
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());
}
тоже не работает, так как вы не можете использовать виджет.[что угодно] в конструкторах классов состояний (по какой-то причине).
Итак, что я могу сделать, чтобы использовать параметры виджета в классе состояния до того, как виджет отобразится на экране?
Заранее спасибо за помощь
Ответ №1:
Для этого следует использовать метод initState, присутствующий в состоянии, вместо конструктора
@override
void initState() {
changingText = widget.text;
super.initState();
}
Комментарии:
1. Как указано выше, в моем случае это не работает, так как initState вызывается только при добавлении виджета в дерево. И я мог бы, как в приведенном выше примере, захотеть использовать параметры «виджет.***» перед выводом виджета на экран