Альтернативный подход использования виджетов с сохранением состояния во флаттере - PullRequest
0 голосов
/ 01 мая 2020

Я изучаю флаттер, и недавно я создал этот очень простой пример лампочки ( Проблемы при использовании пакета провайдера флаттера ).

Я понимаю, что любое приложение может использовать виджеты Consumer и Stateless с основным приложением Home, обеспечивающим все эти модели данных, полностью пропуская виджеты Stateful. Вот небольшой пример

class Data with ChangeNotifier {
  bool isOn = false;

  void toggle() {
    this.isOn = !this.isOn;
    notifyListeners();
  }
}

class MainApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("main app");
    return ChangeNotifierProvider<Data>(
      create: (context) => Data(),
      child: MaterialApp(
        home: Home(),
      ),
    );
  }
}
class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("home");
    return Consumer<Data>(
      builder: (context , data , child) => Scaffold(
        appBar: AppBar(),
        backgroundColor:
            data.isOn ? Colors.yellow[100] : Colors.black,
        body: Center(
          child: Column(
            children: <Widget>[
              Stick(),
              Bulb(),
              Switch()
            ],
          ),
        ),
      ),
    );
  }
}
class Bulb extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("bulb");
    return Consumer<Data>(
      builder: (context , data , child) => Container(
        height: 200,
        width: 250,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.only(
              topLeft: Radius.circular(100),
              topRight: Radius.circular(100),
              bottomLeft: Radius.circular(30),
              bottomRight: Radius.circular(30)),
          boxShadow: data.isOn? <BoxShadow>[BoxShadow(spreadRadius: 5,color: Colors.orange , blurRadius: 100)] : null,
          color: data.isOn ? Colors.yellow : Colors.white,
        ),
        child: GestureDetector(
          onTap: () {
            data.toggle();
          },
        ),
      ),
    );
  }
}

Итак, с учетом сказанного, правильно ли я пришел к выводу, что виджеты «Провайдер» и «без состояний» могут полностью заменить виджеты с «Stateful»? Если да, то будет ли это хорошей идеей?

Пожалуйста, укажите также места, где используются виджеты с отслеживанием состояния и где используются провайдеры.

Спасибо за ваше время и мысли по этому поводу.

1 Ответ

1 голос
/ 01 мая 2020

да, безусловно, вы можете заменить виджет с состоянием на провайдера и виджет без сохранения состояния. От вас полностью зависит, хотите ли вы использовать провайдер или виджет с отслеживанием состояния.

В моем предложении, если ваш виджет с состоянием не большой, и в этом виджете вы не часто вызываете settate, тогда хорошо использовать виджет с состоянием потому что, добавив в него провайдера, вы в конечном итоге создадите дополнительный шаблонный код.

Итак, я предлагаю вам использовать провайдера, когда код вашей страницы большой и вы хотите разбить код на несколько частей.

Кроме того, мне нравится обращать внимание на детскую собственность потребителя. Дочерний виджет потребителя не будет перестраиваться при изменении данных, поэтому вы также можете использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...