Dart mixins. Пример использование миксинов в Dart.

Егор Долгов · 31.07.2019
Статья написана для старой версии Flutter и сейчас обновляется. Часть кода может не компилироваться на актуальной версии.
class MyWidget extends StatefulWidget {
  @override
  State createState() => _MyWidgetState();
}

class _MyWidgetState extends State with MyLoader, MyProgress {
  // мы можем указать столько миксинов, сколько нам это нужно
  @override
  Widget build(BuildContext context) {
    if (!_isLoad) return loader();
    if (!_isProgress) return progress();
    return Text('Complete');
  }
}

mixin MyLoader on State {
  // on State - указывает что класс к которому будет применяться данный миксин,
  // должен быть унаследован от супер класса State.
  bool _isLoad = false;

  Widget loader() {
   return FlatButton(child: CircularProgressIndicator(), onPressed: ()=> setState((){_isLoad = true;}));
  // благодаря on State - мы можем указать на вызов метода setState((){})
  // для того чтобы вызвать обновление родительского виджета
  }
}

mixin MyProgress on State, MyLoader {
  // в этот миксин мы добавили зависимость от миксина MyLoader,
  // т.е. без него нельзя будет воспользоваться этим миксином в одиночку
  // и мы можем обращаться к параметру: _isLoad
  bool _isProgress= false;

  Widget progress() {
   if (!_isLoad) return Text('Error load');
   return FlatButton(child: Text('Progress: 50%'), onPressed: ()=> setState((){_isProgress = true;}));
  }
}