Чтобы преобразовать StatefulWidgetобратно в StatelessWidgetво Flutter, вам необходимо выполнить следующие шаги:
-
Определите виджет с отслеживанием состояния, который вы хотите преобразовать. Предположим, его имя —
MyStatefulWidget. -
Создайте новый виджет без сохранения состояния с тем же именем (
MyStatefulWidget), что и исходный виджет с сохранением состояния. -
Скопируйте метод сборки из виджета с сохранением состояния в новый виджет без сохранения состояния. Это метод, отвечающий за отрисовку пользовательского интерфейса.
-
Удалите код, связанный с состоянием, из виджета с отслеживанием состояния, включая класс состояния и все переменные или методы с отслеживанием состояния.
-
Замените все ссылки на состояние виджета с отслеживанием состояния соответствующими статическими или окончательными значениями.
Вот пример, иллюстрирующий процесс:
// Stateful widget
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Counter:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon(Icons.add),
),
);
}
}
// Stateless widget
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
int _counter = 0;
void _incrementCounter() {
// Increment the counter
_counter++;
}
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Counter:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon(Icons.add),
),
);
}
}
В приведенном выше примере мы преобразовали MyStatefulWidgetв MyStatelessWidget, удалив код, связанный с состоянием, и определив _counterи _incrementCounterнепосредственно внутри метода build.