Skip to content

Instantly share code, notes, and snippets.

@rafdls
Last active May 12, 2020 10:14
Show Gist options
  • Select an option

  • Save rafdls/e9f90f17af3feafd87208788f4e940c5 to your computer and use it in GitHub Desktop.

Select an option

Save rafdls/e9f90f17af3feafd87208788f4e940c5 to your computer and use it in GitHub Desktop.

Revisions

  1. rafdls revised this gist May 12, 2020. 1 changed file with 17 additions and 0 deletions.
    17 changes: 17 additions & 0 deletions launch.json
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,17 @@
    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Dog Match Dev",
    "request": "launch",
    "type": "dart",
    "program": "lib/main_dev.dart",
    },
    {
    "name": "Dog Match Prod",
    "request": "launch",
    "type": "dart",
    "program": "lib/main_prod.dart",
    }
    ]
    }
  2. rafdls revised this gist May 12, 2020. 1 changed file with 71 additions and 0 deletions.
    71 changes: 71 additions & 0 deletions dog_app.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/widgets/dog_stack.dart';
    import 'package:flutter_flavors/widgets/generic_button.dart';
    import 'package:flutter_flavors/widgets/generic_loading_spinner.dart';

    class DogApp extends StatefulWidget {
    DogApp(this.appConfig);

    final AppConfig appConfig;

    @override
    _DogAppState createState() => _DogAppState(appConfig);
    }

    class _DogAppState extends State<DogApp> {
    _DogAppState(this.appConfig);

    final AppConfig appConfig;

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    theme: ThemeData(
    primarySwatch: appConfig.colorSwatch,
    backgroundColor: Theme.of(context).backgroundColor,
    visualDensity: VisualDensity.adaptivePlatformDensity,
    ),
    home: Scaffold(
    appBar: AppBar(
    title: Text(appConfig.appName),
    centerTitle: true,
    ),
    body: Stack(
    children: <Widget>[
    Center(
    child: GenericButton(
    child: Text('More dogs!'),
    onPressed: _refreshDogImages,
    ),
    ),
    Container(
    color: Theme.of(context).canvasColor,
    child: FutureBuilder(
    key: UniqueKey(),
    future: appConfig.dogRepository.getDogImages(count: 10),
    builder: (context, snapshot) {
    final dogImages = snapshot.data as List<ImageProvider>;
    if (snapshot.hasData) {
    return DogStack(images: dogImages);
    } else if (snapshot.hasError) {
    return Center(child: Text('There is an error in dog server'));
    } else {
    return Center(
    child: Container(child: GenericLoadingSpinner()),
    );
    }
    },
    ),
    ),
    ],
    ),
    ),
    debugShowCheckedModeBanner: false,
    );
    }

    void _refreshDogImages() {
    setState(() {});
    }
    }
  3. rafdls revised this gist May 12, 2020. 3 changed files with 30 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions dog_repository.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    import 'package:flutter/material.dart';

    abstract class DogRepository {
    Future<List<ImageProvider>> getDogImages({int count});
    }
    9 changes: 9 additions & 0 deletions dog_repository_dev.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/repository/dog_repository.dart';

    class DogRepositoryDev implements DogRepository {
    @override
    Future<List<ImageProvider>> getDogImages({int count = 1}) {
    return Future.value(List.generate(count, (_) => AssetImage('assets/dog.jpg')));
    }
    }
    16 changes: 16 additions & 0 deletions dog_repository_prod.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,16 @@
    import 'dart:convert';

    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/repository/dog_repository.dart';
    import 'package:http/http.dart' as http;

    class DogRepositoryProd implements DogRepository {
    @override
    Future<List<ImageProvider>> getDogImages({int count = 1}) async {
    final response = await http.get('https://dog.ceo/api/breeds/image/random/$count');
    final List<ImageProvider> images =
    (json.decode(response.body)['message'] as List).map((dogUrl) => NetworkImage(dogUrl)).toList();

    return Future.value(images);
    }
    }
  4. rafdls revised this gist May 12, 2020. 3 changed files with 44 additions and 0 deletions.
    8 changes: 8 additions & 0 deletions app_config.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/repository/dog_repository.dart';

    abstract class AppConfig {
    String get appName;
    DogRepository get dogRepository;
    ColorSwatch get colorSwatch;
    }
    18 changes: 18 additions & 0 deletions app_config_dev.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,18 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/repository/dog_repository.dart';
    import 'package:flutter_flavors/repository/dog_repository_dev.dart';

    class AppConfigDev implements AppConfig {
    final _dogRepository = DogRepositoryDev();
    final _appName = "(DEV) Dog Match";

    @override
    String get appName => _appName;

    @override
    DogRepository get dogRepository => _dogRepository;

    @override
    ColorSwatch get colorSwatch => Colors.orange;
    }
    18 changes: 18 additions & 0 deletions app_config_prod.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,18 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/repository/dog_repository.dart';
    import 'package:flutter_flavors/repository/dog_repository_prod.dart';

    class AppConfigProd implements AppConfig {
    final _dogRepository = DogRepositoryProd();
    final _appName = "Dog Match";

    @override
    String get appName => _appName;

    @override
    DogRepository get dogRepository => _dogRepository;

    @override
    ColorSwatch get colorSwatch => Colors.deepPurple;
    }
  5. rafdls created this gist May 12, 2020.
    9 changes: 9 additions & 0 deletions main_common.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    import 'package:flutter/material.dart';
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/dog_app.dart';

    void mainCommon(AppConfig appConfig) {
    runApp(DogApp(
    appConfig,
    ));
    }
    8 changes: 8 additions & 0 deletions main_dev.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/config/app_config_dev.dart';
    import 'package:flutter_flavors/main_common.dart';

    void main() {
    final AppConfig appConfig = AppConfigDev();
    mainCommon(appConfig);
    }
    8 changes: 8 additions & 0 deletions main_prod.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    import 'package:flutter_flavors/config/app_config.dart';
    import 'package:flutter_flavors/config/app_config_prod.dart';
    import 'package:flutter_flavors/main_common.dart';

    void main() {
    final AppConfig appConfig = AppConfigProd();
    mainCommon(appConfig);
    }