Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/fwe/rolodex/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
flutter_lints: ^6.0.0

flutter:
uses-material-design: true
3 changes: 3 additions & 0 deletions examples/fwe/wikipedia_reader/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# wikipedia_reader

Code excerpts for the Wikipedia reader app in the Flutter tutorial.
34 changes: 34 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step1_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// ignore_for_file: unused_import

// #docregion All
import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

// #docregion main
void main() {
runApp(const MainApp());
}
// #enddocregion main

// #docregion MainApp
class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}
// #enddocregion MainApp

// #enddocregion All
44 changes: 44 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step2_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}

// #docregion ArticleModel
class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
final uri = Uri.https(
'en.wikipedia.org',
'/api/rest_v1/page/random/summary',
);
final response = await get(uri);

if (response.statusCode != 200) {
throw const HttpException('Failed to update resource');
}

return Summary.fromJson(jsonDecode(response.body) as Map<String, Object?>);
}
}

// #enddocregion ArticleModel
34 changes: 34 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step2a_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// ignore_for_file: unused_import

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}

// #docregion ArticleModel
class ArticleModel {
// Properties and methods will be added here.
}

// #enddocregion ArticleModel
43 changes: 43 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step2b_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// ignore_for_file: unused_import, unused_local_variable

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}

// #docregion ArticleModel
class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
final uri = Uri.https(
'en.wikipedia.org',
'/api/rest_v1/page/random/summary',
);
final response = await get(uri);

// TODO: Add error handling and JSON parsing.
throw UnimplementedError();
}
}

// #enddocregion ArticleModel
47 changes: 47 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step2c_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// ignore_for_file: unused_import

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}

// #docregion ArticleModel
class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
final uri = Uri.https(
'en.wikipedia.org',
'/api/rest_v1/page/random/summary',
);
final response = await get(uri);

if (response.statusCode != 200) {
throw const HttpException('Failed to update resource');
}

// TODO: Parse JSON and return Summary.
throw UnimplementedError();
}
}

// #enddocregion ArticleModel
71 changes: 71 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step3_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// ignore_for_file: unused_import

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Wikipedia Flutter')),
body: const Center(child: Text('Loading...')),
),
);
}
}

class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
final uri = Uri.https(
'en.wikipedia.org',
'/api/rest_v1/page/random/summary',
);
final response = await get(uri);

if (response.statusCode != 200) {
throw const HttpException('Failed to update resource');
}

return Summary.fromJson(jsonDecode(response.body) as Map<String, Object?>);
}
}

class ArticleViewModel extends ChangeNotifier {
ArticleViewModel({required this.model});
final ArticleModel model;

Summary? _summary;
Summary? get summary => _summary;
bool _isLoading = false;
bool get isLoading => _isLoading;
Exception? _error;
Exception? get error => _error;

Future<void> fetchArticle() async {
_isLoading = true;
_error = null;
notifyListeners();

try {
_summary = await model.getRandomArticleSummary();
_error = null;
} on Exception catch (e) {
_error = e;
} finally {
_isLoading = false;
notifyListeners();
}
}
}
42 changes: 42 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step3a_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// ignore_for_file: unused_import

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

void main() {
runApp(const MainApp());
}

class MainApp extends StatelessWidget {
const MainApp({super.key});

@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(body: Center(child: Text('Loading...'))),
);
}
}

class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
return throw UnimplementedError();
}
}

// #docregion ArticleViewModel
class ArticleViewModel extends ChangeNotifier {
final ArticleModel model;
Summary? summary;
Exception? error;
bool isLoading = false;

ArticleViewModel(this.model);
}

// #enddocregion ArticleViewModel
32 changes: 32 additions & 0 deletions examples/fwe/wikipedia_reader/lib/step3b_main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// ignore_for_file: unused_import

import 'dart:convert';
import 'dart:io';

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

import 'summary.dart';

class ArticleModel {
Future<Summary> getRandomArticleSummary() async {
throw UnimplementedError();
}
}

// #docregion ArticleViewModel
class ArticleViewModel extends ChangeNotifier {
final ArticleModel model;
Summary? summary;
Exception? error;
bool isLoading = false;

ArticleViewModel(this.model) {
fetchArticle();
}

// Methods will be added next.
Future<void> fetchArticle() async {}
}

// #enddocregion ArticleViewModel
Loading
Loading