Skip to content

Instantly share code, notes, and snippets.

@yamnikov-oleg
Last active March 3, 2025 07:59
Show Gist options
  • Save yamnikov-oleg/d9111fe45b06d5e5c95459d26b825c30 to your computer and use it in GitHub Desktop.
Save yamnikov-oleg/d9111fe45b06d5e5c95459d26b825c30 to your computer and use it in GitHub Desktop.
Flutter: Форма
// ЗАДАНИЕ:
// Перед вами нефункциональный черновик экрана с формой заказа.
// Попробуйте запустить его.
// По нажатию на кнопку "Отправить" форма должна отправлять запрос
// на бэкенд с помощью метода ApiClient.post.
//
// Завершите реализацию экрана с хорошим UX на ваше усмотрение.
// Допустимо сделать рефакторинг виджетов.
// Бонус: используйте в реализации пакет state management на ваш выбор
// (в dartpad все популярные пакеты предустановлены).
import 'package:flutter/material.dart';
class ApiClient {
Future<void> post({String? name, String? address}) async {
// post симулирует сетевой запрос.
// Будем считать, что эта функция - черный ящик.
await Future.delayed(const Duration(seconds: 3));
}
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Заказ',
debugShowCheckedModeBanner: false,
theme: ThemeData(colorSchemeSeed: Colors.blue),
home: const FormScreen(),
);
}
}
class FormScreen extends StatelessWidget {
const FormScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Заказ")),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
const TextField(
decoration: InputDecoration(label: Text("Полное имя")),
),
const SizedBox(height: 16.0),
const TextField(
decoration: InputDecoration(label: Text("Адрес")),
),
const SizedBox(height: 16.0),
FilledButton(onPressed: () {}, child: const Text("Отправить")),
],
),
),
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment