В Flutter виджеты можно разделить на две категории: с сохранением состояния и без сохранения состояния. Виджеты с сохранением состояния поддерживают свое собственное изменяемое состояние, тогда как виджеты без состояния являются неизменяемыми и не имеют никакого внутреннего состояния. Иногда в процессе разработки вы можете обнаружить, что виджет с сохранением состояния можно упростить до виджета без сохранения состояния. В этой статье мы рассмотрим различные методы рефакторинга виджета с сохранением состояния в виджет без сохранения состояния с помощью Android Studio.
Метод 1: извлечение виджета без сохранения состояния
Один из самых простых способов преобразования виджета с сохранением состояния в виджет без сохранения состояния — это извлечение кода пользовательского интерфейса виджета и создание нового виджета без сохранения состояния. Вот пример:
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 Column(
children: [
Text('Counter: $counter'),
RaisedButton(
onPressed: incrementCounter,
child: Text('Increment'),
),
],
);
}
}
Чтобы реорганизовать его в виджет без сохранения состояния, мы извлекем код пользовательского интерфейса в новый виджет:
class MyStatelessWidget extends StatelessWidget {
final int counter;
final VoidCallback onPressed;
MyStatelessWidget({
required this.counter,
required this.onPressed,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Counter: $counter'),
RaisedButton(
onPressed: onPressed,
child: Text('Increment'),
),
],
);
}
}
Теперь вы можете заменить виджет с сохранением состояния на виджет без сохранения состояния:
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 MyStatelessWidget(
counter: counter,
onPressed: incrementCounter,
);
}
}
Метод 2: использование класса StatelessWidget
Другой подход заключается в прямом преобразовании виджета с сохранением состояния в виджет без сохранения состояния путем расширения класса StatelessWidgetи перемещения кода, связанного с состоянием, во внешние классы или поставщики.. Вот пример:
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 Column(
children: [
Text('Counter: $counter'),
RaisedButton(
onPressed: incrementCounter,
child: Text('Increment'),
),
],
);
}
}
Чтобы преобразовать его в виджет без сохранения состояния, удалите код виджета с сохранением состояния и переместите код, связанный с состоянием, во внешние классы или поставщики:
class MyStatelessWidget extends StatelessWidget {
final int counter;
final VoidCallback onPressed;
MyStatelessWidget({
required this.counter,
required this.onPressed,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Counter: $counter'),
RaisedButton(
onPressed: onPressed,
child: Text('Increment'),
),
],
);
}
}
class MyStatefulController {
int counter = 0;
void incrementCounter() {
counter++;
}
}
class MyStatefulProvider extends InheritedWidget {
final MyStatefulController controller;
MyStatefulProvider({
required this.controller,
required Widget child,
}) : super(child: child);
static MyStatefulProvider? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyStatefulProvider>();
}
@override
bool updateShouldNotify(MyStatefulProvider oldWidget) {
return oldWidget.controller != controller;
}
}
class MyStatefulWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final controller = MyStatefulProvider.of(context)!.controller;
return MyStatelessWidget(
counter: controller.counter,
onPressed: controller.incrementCounter,
);
}
}
Рефакторинг виджета с сохранением состояния в виджет без сохранения состояния может упростить процесс разработки и повысить производительность вашего приложения Flutter. В этой статье мы рассмотрели два метода рефакторинга виджета с сохранением состояния в виджет без сохранения состояния с помощью Android Studio. Первый метод включал извлечение кода пользовательского интерфейса в новый виджет без сохранения состояния, а второй метод использовал класс StatelessWidget и внешние классы или поставщики для обработки кода, связанного с состоянием. Следуя этим методам, вы можете эффективно преобразовать виджеты с сохранением состояния в виджеты без сохранения состояния и повысить удобство обслуживания и эффективность вашего кода Flutter.