3. MaterialApp
MaterialApp является отправной точкой вашего приложения, оно сообщает
Flutter, что вы собираетесь использовать компоненты Material и следовать
дизайну материалов в вашем приложении.
4. Scaffold
Scaffold — это набор виджетов, которые визуально представляют собой
пользовательский интерфейс
6. StatelessWidget
StatelessWidget – это виджет который не имеет состония. Такие видджеты зависят
только от конфигурационных параметров и от родительских виджетов.
Text(
'I like Flutter!',
style: TextStyle(fontWeight: FontWeight.bold),
);
7. StatefulWidget
StatefulWidget – это виджет который имеет состояние.
Под изменяемым состоянием понимается изменение внутреннего состояния
экземпляра класса в зависимости от какого-то события (по нажатию, времени и
пр.)
class MyWidget extends StatefulWidget {
@override
createState() => new MyWidgetState();
}
class MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return new Text('my text');
}
}
8. Layouts
Основой механизма разметки Flutter являются виджеты. Во Flutter почти все
является виджетами. Изображения, значки и текст, которые вы видите в
приложении Flutter, также являются виджетами.
9. Center
Center - это виджет, который позволяет разместить в себе виджет по центру.
23. Navigation
Большинство приложений содержат несколько экранов для отображения
различных типов информации. Например, приложение может иметь экран, на
котором отображаются продукты. Когда пользователь нажимает на изображение
продукта, на новом экране отображаются сведения о продукте.
24. Пример
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(
title: 'Named Routes Demo',
// Start the app with the "/" named route. In this case, the app starts
// on the FirstScreen widget.
initialRoute: '/',
routes: {
// When navigating to the "/" route, build the FirstScreen widget.
'/': (context) => FirstScreen(),
// When navigating to the "/second" route, build the SecondScreen widget.
'/second': (context) => SecondScreen(),
},
));
}
25. import 'package:flutter/material.dart';
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Screen'),
),
body: Center(
child: RaisedButton(
child: Text('Launch screen'),
onPressed: () {
// Navigate to the second screen using a named route.
Navigator.pushNamed(context, '/second');
},
),
),
);
}
}
26. import 'package:flutter/material.dart';
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Screen"),
),
body: Center(
child: RaisedButton(
onPressed: () {
// Navigate back to the first screen by popping the current route
// off the stack.
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}
27. Network
Получение данных из Интернета необходимо для большинства приложений. К
счастью, Dart и Flutter предоставляют инструменты, такие как пакет http, для этого
типа работы.
Для получения данных из сети необходимо:
1. Добавить пакет http в проект
2. Сделать сетевой запрос
3. Преобразовать ответ в объект Dart
4. Получить и отобразить данные
28. 1. Добавить пакета http в проект
Пакет http обеспечивает самый простой способ извлечения данных из Интернета.
Чтобы установить пакет http , добавьте его в раздел зависимостей файла
pubspec.yaml .
dependencies:
http: <latest_version>
Чтобы использовать http пакет, его нужно импортировать.
import 'package:http/http.dart' as http;
29. 2. Сделать сетевой запрос
Future<http.Response> fetchPost() {
return http.get('https://jsonplaceholder.typicode.com/posts/1');
}
Метод http.get() возвращает Future , содержащий ответ.
Future - основной класс Dart для работы с асинхронными операциями.
Объект Future представляет потенциальное значение или ошибку, которое
будет доступна в будущем.
Класс http.Response содержит данные, полученные при успешном вызове
http .
30. 3. Преобразовать ответ в объект Dart
Самый простой способ преобразовать сырые данные - это преобразовать JSON
вручную.
31. 3.1 Создать Post класс
class Post {
final int userId;
final int id;
final String title;
final String body;
Post({this.userId, this.id, this.title, this.body});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
userId: json['userId'],
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}
32. 3.2 Конвертировать http.Response в Post
Future<Post> fetchPost() async {
final response =
await http.get('https://jsonplaceholder.typicode.com/posts/1');
if (response.statusCode == 200) {
// If server returns an OK response, parse the JSON.
return Post.fromJson(json.decode(response.body));
} else {
// If that response was not OK, throw an error.
throw Exception('Failed to load post');
}
}
33. 4. Получить и отобразить данные
Чтобы получить данные и отобразить их на экране, используйте виджет
FutureBuilder. Виджет FutureBuilder поставляется с Flutter и облегчает работу с
асинхронными источниками данных.
Вы должны предоставить два параметра:
Future, с которым вы хотите работать. В этом случае вызовите функцию
fetchPost() .
Функция конструктор, которая сообщает Flutter, что визуализировать, в
зависимости от состояния Future : загрузка, успех или ошибка.
34. FutureBuilder<Post>(
future: fetchPost(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.title);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
);
35. Пример:
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Screen"),
),
body: Center(
child: FutureBuilder<Post>(
future: fetchPost(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.title);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
)));
}
}