abstract_widget 1.0.0 copy "abstract_widget: ^1.0.0" to clipboard
abstract_widget: ^1.0.0 copied to clipboard

discontinued

Generic widget that builds itself depending on the derived class of current value.

example/lib/main.dart

import 'package:abstract_widget/abstract_widget.dart';
import 'package:flutter/material.dart';

import 'animals.dart';

void main() => runApp(AnimalsPage(animalCount: 20));

class AnimalsPage extends StatelessWidget {
  AnimalsPage({int animalCount})
      : _animals = List.generate(animalCount, (_) => Animal.random());

  final List<Animal> _animals;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('AbstractWidget example')),
        body: Builder(
          builder: (subContext) => ListView.builder(
                itemCount: _animals.length,
                itemBuilder: (_, index) =>
                    _buildAnimalItem(subContext, _animals[index]),
              ),
        ),
      ),
    );
  }

  Widget _buildAnimalItem(BuildContext context, Animal animal) {
    return Card(
      elevation: 2.0,
      child: ListTile(
        leading: Image.network(
          animal.imageUrl,
          width: 48.0,
        ),
        title: Text(animal.runtimeType.toString()),
        subtitle: AbstractWidget(animal)
          ..when<Doge>(_buildDoge)
          ..when<Cate>(_buildCate)
          ..contextWhen<Birb>(_buildBirb)
          ..when<Snek>((it) => Text(it.inAscii)),
        trailing: IconButton(
          icon: Icon(Icons.call),
          onPressed: () {},
        ),
        onTap: () => _showAnimalInfo(context, animal),
      ),
    );
  }

  Widget _buildDoge(Doge doge) {
    final style = TextStyle(fontSize: 12.0);
    return Row(children: [
      Expanded(child: Text('Bad deeds: ${doge.badDeeds}', style: style)),
      Expanded(child: Text('Good deeds: ${doge.goodDeeds}', style: style)),
    ]);
  }

  Widget _buildCate(Cate cate) {
    final style = TextStyle(fontSize: 12.0);
    final height = 20.0;
    return Padding(
      padding: EdgeInsets.symmetric(vertical: 6.0),
      child: Row(children: [
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                height: height,
                child: Text(cate.breed),
              ),
              Text('Breed', style: style),
            ],
          ),
        ),
        Expanded(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: [
              Flexible(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Container(
                      height: height,
                      child: Icon(
                        cate.friendly ? Icons.check : Icons.clear,
                        color: Colors.black54,
                        size: height,
                      ),
                    ),
                    Text('Likes birbs', style: style),
                  ],
                ),
              ),
            ],
          ),
        ),
      ]),
    );
  }

  Widget _buildBirb(BuildContext context, Birb birb) {
    final height = 20.0;
    return GestureDetector(
      onTap: () => _showBirbSpeedDialog(context, birb.speed),
      child: Stack(children: [
        Center(
          child: Container(
            height: height,
            child: LinearProgressIndicator(value: birb.speed / birb.maxSpeed),
          ),
        ),
        Container(
          height: height,
          child: Center(
            child: Text(
              '${birb.speed} kph',
              style: TextStyle(color: Colors.white, fontSize: 12.0),
            ),
          ),
        ),
      ]),
    );
  }

  void _showBirbSpeedDialog(BuildContext context, int speed) {
    showDialog(
      context: context,
      builder: (_) => Dialog(
            child: Padding(
              padding: EdgeInsets.all(16.0),
              child: Text(
                '$speed kph equals to ${(speed * 0.6214).toInt()} mph.',
              ),
            ),
          ),
    );
  }

  void _showAnimalInfo(BuildContext context, Animal animal) {
    final animalName = animal.runtimeType.toString().toLowerCase();
    Scaffold.of(context).showSnackBar(SnackBar(
      duration: Duration(seconds: 1),
      content: Text("It's a $animalName!"),
    ));
  }
}
0
likes
30
pub points
0%
popularity

Publisher

unverified uploader

Generic widget that builds itself depending on the derived class of current value.

Homepage
Repository (GitHub)
View/report issues

License

MIT (LICENSE)

Dependencies

flutter

More

Packages that depend on abstract_widget