You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.8 KiB
127 lines
3.8 KiB
7 months ago
|
import 'dart:io';
|
||
|
|
||
|
import 'package:counters/address.dart';
|
||
|
import 'package:counters/counters_page.dart';
|
||
|
import 'package:counters/datbase.dart';
|
||
|
import 'package:counters/new_address_page.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||
|
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||
|
|
||
|
void main() {
|
||
|
if (Platform.isWindows || Platform.isLinux) {
|
||
|
sqfliteFfiInit();
|
||
|
}
|
||
|
databaseFactory = databaseFactoryFfi;
|
||
|
runApp(const MyApp());
|
||
|
}
|
||
|
|
||
|
class MyApp extends StatelessWidget {
|
||
|
const MyApp({super.key});
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return MaterialApp(
|
||
|
title: 'Журнал счетчиков',
|
||
|
localizationsDelegates: const [
|
||
|
AppLocalizations.delegate,
|
||
|
GlobalMaterialLocalizations.delegate,
|
||
|
],
|
||
|
supportedLocales: AppLocalizations.supportedLocales,
|
||
|
theme: ThemeData(
|
||
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
||
|
useMaterial3: true,
|
||
|
),
|
||
|
// ignore: prefer_const_constructors
|
||
|
home: MyHomePage(),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class MyHomePage extends StatefulWidget {
|
||
|
const MyHomePage({super.key});
|
||
|
|
||
|
@override
|
||
|
State<MyHomePage> createState() => _MyHomePageState();
|
||
|
}
|
||
|
|
||
|
class _MyHomePageState extends State<MyHomePage> {
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
final addresses = DBProvider.db.getAllAddress();
|
||
|
return Scaffold(
|
||
|
appBar: AppBar(
|
||
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
||
|
title: Text(AppLocalizations.of(context)!.app_title),
|
||
|
),
|
||
|
body: Center(
|
||
|
child: FutureBuilder<List<Address>>(
|
||
|
future: addresses,
|
||
|
builder: (context, snapshot) {
|
||
|
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
||
|
return AddressesListView(addresses: snapshot.data!);
|
||
|
}
|
||
|
|
||
|
return Text(AppLocalizations.of(context)!.empty_addresses_list);
|
||
|
},
|
||
|
)),
|
||
|
floatingActionButton: FloatingActionButton(
|
||
|
onPressed: () {
|
||
|
Navigator.push(context,
|
||
|
MaterialPageRoute(builder: (context) => NewAddressPage()))
|
||
|
.then((_) => setState(() {}));
|
||
|
},
|
||
|
tooltip: AppLocalizations.of(context)!.add_new_address_tooltip,
|
||
|
child: const Icon(Icons.add),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class AddressesListView extends StatelessWidget {
|
||
|
const AddressesListView({
|
||
|
super.key,
|
||
|
required this.addresses,
|
||
|
});
|
||
|
|
||
|
final List<Address> addresses;
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return ListView.builder(
|
||
|
itemCount: addresses.length,
|
||
|
itemBuilder: (context, possition) {
|
||
|
return TextButton(
|
||
|
onPressed: () {
|
||
|
Navigator.push(
|
||
|
context,
|
||
|
MaterialPageRoute(
|
||
|
builder: (context) => CountersPage(
|
||
|
title: addresses[possition].streetName,
|
||
|
comments: addresses[possition].comments)));
|
||
|
},
|
||
|
child: Align(
|
||
|
alignment: Alignment.centerLeft,
|
||
|
child: Padding(
|
||
|
padding: const EdgeInsets.all(16.0),
|
||
|
child: Column(
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||
|
children: [
|
||
|
Text(
|
||
|
addresses[possition].streetName,
|
||
|
style: Theme.of(context).textTheme.bodyLarge,
|
||
|
),
|
||
|
Text(
|
||
|
addresses[possition].comments,
|
||
|
style: Theme.of(context).textTheme.bodySmall,
|
||
|
),
|
||
|
],
|
||
|
)),
|
||
|
),
|
||
|
);
|
||
|
});
|
||
|
}
|
||
|
}
|