Преобразование виджета с сохранением состояния в виджет без сохранения состояния во Flutter с использованием Android Studio: подробное руководство

В 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.