Сергей Марков
7 months ago
commit
4575930987
32 changed files with 1379 additions and 0 deletions
@ -0,0 +1,46 @@ |
|||||||
|
# Miscellaneous |
||||||
|
*.class |
||||||
|
*.log |
||||||
|
*.pyc |
||||||
|
*.swp |
||||||
|
.DS_Store |
||||||
|
.atom/ |
||||||
|
.buildlog/ |
||||||
|
.history |
||||||
|
.svn/ |
||||||
|
migrate_working_dir/ |
||||||
|
|
||||||
|
# IntelliJ related |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
*.iws |
||||||
|
.idea/ |
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in |
||||||
|
# VS Code which you may wish to be included in version control, so this line |
||||||
|
# is commented out by default. |
||||||
|
#.vscode/ |
||||||
|
|
||||||
|
# Flutter/Dart/Pub related |
||||||
|
**/doc/api/ |
||||||
|
**/ios/Flutter/.last_build_id |
||||||
|
.dart_tool/ |
||||||
|
.flutter-plugins |
||||||
|
.flutter-plugins-dependencies |
||||||
|
.pub-cache/ |
||||||
|
.pub/ |
||||||
|
/build/ |
||||||
|
|
||||||
|
# Symbolication related |
||||||
|
app.*.symbols |
||||||
|
|
||||||
|
# Obfuscation related |
||||||
|
app.*.map.json |
||||||
|
|
||||||
|
# Android Studio will place build artifacts here |
||||||
|
/android/app/debug |
||||||
|
/android/app/profile |
||||||
|
/android/app/release |
||||||
|
|
||||||
|
# Aurora generated |
||||||
|
/aurora/flutter |
@ -0,0 +1,33 @@ |
|||||||
|
# This file tracks properties of this Flutter project. |
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
||||||
|
# |
||||||
|
# This file should be version controlled and should not be manually edited. |
||||||
|
|
||||||
|
version: |
||||||
|
revision: "d3e00ac70443dbc0df7d0b56bff94c18d760b02f" |
||||||
|
channel: "master" |
||||||
|
|
||||||
|
project_type: app |
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command |
||||||
|
migration: |
||||||
|
platforms: |
||||||
|
- platform: root |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
- platform: linux |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
- platform: aurora |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
|
||||||
|
# User provided section |
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be |
||||||
|
# ignored by the migrate tool. |
||||||
|
# |
||||||
|
# Files that are not part of the templates will be ignored by default. |
||||||
|
unmanaged_files: |
||||||
|
- 'lib/main.dart' |
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj' |
@ -0,0 +1,16 @@ |
|||||||
|
# counters |
||||||
|
|
||||||
|
A new Flutter project. |
||||||
|
|
||||||
|
## Getting Started |
||||||
|
|
||||||
|
This project is a starting point for a Flutter application. |
||||||
|
|
||||||
|
A few resources to get you started if this is your first Flutter project: |
||||||
|
|
||||||
|
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) |
||||||
|
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) |
||||||
|
|
||||||
|
For help getting started with Flutter development, view the |
||||||
|
[online documentation](https://docs.flutter.dev/), which offers tutorials, |
||||||
|
samples, guidance on mobile development, and a full API reference. |
@ -0,0 +1,28 @@ |
|||||||
|
# This file configures the analyzer, which statically analyzes Dart code to |
||||||
|
# check for errors, warnings, and lints. |
||||||
|
# |
||||||
|
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled |
||||||
|
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be |
||||||
|
# invoked from the command line by running `flutter analyze`. |
||||||
|
|
||||||
|
# The following line activates a set of recommended lints for Flutter apps, |
||||||
|
# packages, and plugins designed to encourage good coding practices. |
||||||
|
include: package:flutter_lints/flutter.yaml |
||||||
|
|
||||||
|
linter: |
||||||
|
# The lint rules applied to this project can be customized in the |
||||||
|
# section below to disable rules from the `package:flutter_lints/flutter.yaml` |
||||||
|
# included above or to enable additional rules. A list of all available lints |
||||||
|
# and their documentation is published at https://dart.dev/lints. |
||||||
|
# |
||||||
|
# Instead of disabling a lint rule for the entire project in the |
||||||
|
# section below, it can also be suppressed for a single line of code |
||||||
|
# or a specific dart file by using the `// ignore: name_of_lint` and |
||||||
|
# `// ignore_for_file: name_of_lint` syntax on the line or in the file |
||||||
|
# producing the lint. |
||||||
|
rules: |
||||||
|
# avoid_print: false # Uncomment to disable the `avoid_print` rule |
||||||
|
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule |
||||||
|
|
||||||
|
# Additional information about this file can be found at |
||||||
|
# https://dart.dev/guides/language/analysis-options |
@ -0,0 +1,47 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
project(com.example.counters LANGUAGES CXX) |
||||||
|
|
||||||
|
include(GNUInstallDirs) |
||||||
|
|
||||||
|
set(BINARY_NAME ${CMAKE_PROJECT_NAME}) |
||||||
|
set(FLUTTER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/flutter) |
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17) |
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-Wall -Wextra") |
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3") |
||||||
|
|
||||||
|
set(CMAKE_SKIP_RPATH OFF) |
||||||
|
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../share/${BINARY_NAME}/lib") |
||||||
|
|
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(FlutterEmbedder REQUIRED IMPORTED_TARGET flutter-embedder) |
||||||
|
|
||||||
|
add_executable(${BINARY_NAME} main.cpp ${FLUTTER_DIR}/generated_plugin_registrant.cpp) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::FlutterEmbedder) |
||||||
|
target_include_directories(${BINARY_NAME} PRIVATE ${FLUTTER_DIR}) |
||||||
|
|
||||||
|
include(flutter/generated_plugins.cmake) |
||||||
|
|
||||||
|
set(PACKAGE_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME}) |
||||||
|
set(DESKTOP_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/applications) |
||||||
|
set(ICONS_INSTALL_ROOT_DIR ${CMAKE_INSTALL_DATADIR}/icons/hicolor) |
||||||
|
|
||||||
|
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD |
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy |
||||||
|
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libflutter-embedder.so |
||||||
|
${PROJECT_BINARY_DIR}/bundle/lib/libflutter-embedder.so) |
||||||
|
|
||||||
|
install(FILES ${PROJECT_BINARY_DIR}/bundle/icudtl.dat DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/flutter_assets DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/lib DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) |
||||||
|
install(FILES desktop/${BINARY_NAME}.desktop DESTINATION ${DESKTOP_INSTALL_DIR}) |
||||||
|
|
||||||
|
foreach(ICONS_SIZE 86x86 108x108 128x128 172x172) |
||||||
|
install(FILES icons/${ICONS_SIZE}.png |
||||||
|
RENAME ${BINARY_NAME}.png |
||||||
|
DESTINATION ${ICONS_INSTALL_ROOT_DIR}/${ICONS_SIZE}/apps/) |
||||||
|
endforeach(ICONS_SIZE) |
@ -0,0 +1,12 @@ |
|||||||
|
[Desktop Entry] |
||||||
|
Type=Application |
||||||
|
Name=counters |
||||||
|
Comment=A new Flutter project. |
||||||
|
Icon=com.example.counters |
||||||
|
Exec=/usr/bin/com.example.counters |
||||||
|
X-Nemo-Application-Type=silica-qt5 |
||||||
|
|
||||||
|
[X-Application] |
||||||
|
Permissions= |
||||||
|
OrganizationName=com.example |
||||||
|
ApplicationName=counters |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 6.5 KiB |
@ -0,0 +1,9 @@ |
|||||||
|
#include <flutter/application.h> |
||||||
|
#include "generated_plugin_registrant.h" |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) { |
||||||
|
Application::Initialize(argc, argv); |
||||||
|
RegisterPlugins(); |
||||||
|
Application::Launch(); |
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
%global __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$ |
||||||
|
%global __requires_exclude ^lib(dconf|flutter-embedder|maliit-glib|.+_platform_plugin)\\.so.*$ |
||||||
|
|
||||||
|
Name: com.example.counters |
||||||
|
Summary: A new Flutter project. |
||||||
|
Version: 0.1.0 |
||||||
|
Release: 1 |
||||||
|
License: Proprietary |
||||||
|
Source0: %{name}-%{version}.tar.zst |
||||||
|
|
||||||
|
BuildRequires: cmake |
||||||
|
BuildRequires: ninja |
||||||
|
BuildRequires: pkgconfig(flutter-embedder) |
||||||
|
|
||||||
|
%description |
||||||
|
%{summary}. |
||||||
|
|
||||||
|
%prep |
||||||
|
%autosetup |
||||||
|
|
||||||
|
%build |
||||||
|
%cmake -GNinja -DCMAKE_BUILD_TYPE=%{_flutter_build_type} |
||||||
|
%ninja_build |
||||||
|
|
||||||
|
%install |
||||||
|
%ninja_install |
||||||
|
|
||||||
|
%files |
||||||
|
%{_bindir}/%{name} |
||||||
|
%{_datadir}/%{name}/* |
||||||
|
%{_datadir}/applications/%{name}.desktop |
||||||
|
%{_datadir}/icons/hicolor/*/apps/%{name}.png |
@ -0,0 +1,3 @@ |
|||||||
|
arb-dir: lib/l10n |
||||||
|
template-arb-file: app_en.arb |
||||||
|
output-localization-file: app_localizations.dart |
@ -0,0 +1,29 @@ |
|||||||
|
// To parse this JSON data, do |
||||||
|
// |
||||||
|
// final address = addressFromJson(jsonString); |
||||||
|
|
||||||
|
import 'dart:convert'; |
||||||
|
|
||||||
|
Address addressFromJson(String str) => Address.fromJson(json.decode(str)); |
||||||
|
|
||||||
|
String addressToJson(Address data) => json.encode(data.toJson()); |
||||||
|
|
||||||
|
class Address { |
||||||
|
String streetName; |
||||||
|
String comments; |
||||||
|
|
||||||
|
Address({ |
||||||
|
required this.streetName, |
||||||
|
required this.comments, |
||||||
|
}); |
||||||
|
|
||||||
|
factory Address.fromJson(Map<String, dynamic> json) => Address( |
||||||
|
streetName: json["street_name"], |
||||||
|
comments: json["comments"], |
||||||
|
); |
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => { |
||||||
|
"street_name": streetName, |
||||||
|
"comments": comments, |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; |
||||||
|
|
||||||
|
class CountersPage extends StatefulWidget { |
||||||
|
const CountersPage({super.key, required this.title, required this.comments}); |
||||||
|
|
||||||
|
final String title; |
||||||
|
final String comments; |
||||||
|
|
||||||
|
@override |
||||||
|
State<CountersPage> createState() => _CountersPageState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _CountersPageState extends State<CountersPage> { |
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary, |
||||||
|
title: Column( |
||||||
|
crossAxisAlignment: CrossAxisAlignment.center, |
||||||
|
mainAxisAlignment: MainAxisAlignment.start, |
||||||
|
children: [ |
||||||
|
Text( |
||||||
|
widget.title, |
||||||
|
style: Theme.of(context).textTheme.bodyLarge, |
||||||
|
), |
||||||
|
Text( |
||||||
|
widget.comments, |
||||||
|
style: Theme.of(context).textTheme.bodySmall, |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
), |
||||||
|
body: const SizedBox(), |
||||||
|
floatingActionButton: FloatingActionButton( |
||||||
|
onPressed: () { |
||||||
|
Navigator.push( |
||||||
|
context, |
||||||
|
MaterialPageRoute( |
||||||
|
builder: (context) => const NewCounterPage())) |
||||||
|
.then((_) => setState(() {})); |
||||||
|
}, |
||||||
|
tooltip: AppLocalizations.of(context)!.add_new_counter_tooltip, |
||||||
|
child: const Icon(Icons.add), |
||||||
|
)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class NewCounterPage extends StatelessWidget { |
||||||
|
const NewCounterPage({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary, |
||||||
|
title: Text(AppLocalizations.of(context)!.new_counter_title)), |
||||||
|
body: const SizedBox(), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
import 'dart:ffi'; |
||||||
|
import 'dart:io'; |
||||||
|
|
||||||
|
import 'package:counters/address.dart'; |
||||||
|
import 'package:path/path.dart'; |
||||||
|
import 'package:path_provider/path_provider.dart'; |
||||||
|
import 'package:sqflite/sqflite.dart'; |
||||||
|
|
||||||
|
class DBProvider { |
||||||
|
static const int dbVersion = 1; |
||||||
|
static const String addressTableName = 'address$dbVersion'; |
||||||
|
DBProvider._(); |
||||||
|
static final DBProvider db = DBProvider._(); |
||||||
|
|
||||||
|
static Database? _database; |
||||||
|
Future<Database> get database async { |
||||||
|
if (_database != null) return _database!; |
||||||
|
|
||||||
|
_database = await initDB(); |
||||||
|
return _database!; |
||||||
|
} |
||||||
|
|
||||||
|
initDB() async { |
||||||
|
Directory documentsDirectory = await getApplicationDocumentsDirectory(); |
||||||
|
String path = join(documentsDirectory.path, "counters.db"); |
||||||
|
print(path); |
||||||
|
return await openDatabase(path, version: dbVersion, onOpen: (db) {}, |
||||||
|
onCreate: (Database db, int version) async { |
||||||
|
await db.execute("CREATE TABLE $addressTableName (" |
||||||
|
"id INTEGER PRIMARY KEY," |
||||||
|
"street_name TEXT," |
||||||
|
"comments TEXT" |
||||||
|
")"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
Future<int> newAddress(Address newAddress) async { |
||||||
|
final db = await database; |
||||||
|
var res = await db.insert(addressTableName, newAddress.toJson()); |
||||||
|
return res; |
||||||
|
} |
||||||
|
|
||||||
|
Future<Object> getAddress(int id) async { |
||||||
|
final db = await database; |
||||||
|
var res = |
||||||
|
await db.query(addressTableName, where: "id = ?", whereArgs: [id]); |
||||||
|
return res.isNotEmpty ? Address.fromJson(res.first) : Null; |
||||||
|
} |
||||||
|
|
||||||
|
Future<List<Address>> getAllAddress() async { |
||||||
|
final db = await database; |
||||||
|
var res = await db.query(addressTableName); |
||||||
|
List<Address> list = |
||||||
|
res.isNotEmpty ? res.map((c) => Address.fromJson(c)).toList() : []; |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
{ |
||||||
|
"app_title": "Counters journal", |
||||||
|
"@app_title": { |
||||||
|
"description": "The application title" |
||||||
|
}, |
||||||
|
"empty_addresses_list": "List of addresses is empty", |
||||||
|
"add_new_address_tooltip": "New address", |
||||||
|
"new_address_title": "New address", |
||||||
|
"enter_your_address": "Enter your address", |
||||||
|
"enter_your_address_comments": "Enter your comment", |
||||||
|
"add_new_address_button": "Add", |
||||||
|
"new_counter_title": "New counter", |
||||||
|
"add_new_counter_tooltip": "New counter" |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
{ |
||||||
|
"app_title": "Журнал счетчиков", |
||||||
|
"empty_addresses_list": "Список адресов пуст", |
||||||
|
"add_new_address_tooltip": "Добавить адрес", |
||||||
|
"new_address_title": "Новый адрес", |
||||||
|
"enter_your_address": "Введите ваш адрес", |
||||||
|
"enter_your_address_comments": "Добавте комментарий (опционально)", |
||||||
|
"add_new_address_button": "Добавить", |
||||||
|
"new_counter_title": "Новый счетчик", |
||||||
|
"add_new_counter_tooltip": "Новый счетчик" |
||||||
|
} |
@ -0,0 +1,126 @@ |
|||||||
|
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, |
||||||
|
), |
||||||
|
], |
||||||
|
)), |
||||||
|
), |
||||||
|
); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
import 'package:counters/address.dart'; |
||||||
|
import 'package:counters/datbase.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; |
||||||
|
|
||||||
|
class NewAddressPage extends StatelessWidget { |
||||||
|
final streetNameController = TextEditingController(); |
||||||
|
final commentsController = TextEditingController(); |
||||||
|
|
||||||
|
NewAddressPage({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary, |
||||||
|
title: Text(AppLocalizations.of(context)!.new_address_title), |
||||||
|
), |
||||||
|
body: Center( |
||||||
|
child: Padding( |
||||||
|
padding: const EdgeInsets.all(8.0), |
||||||
|
child: Column( |
||||||
|
mainAxisAlignment: MainAxisAlignment.center, |
||||||
|
crossAxisAlignment: CrossAxisAlignment.center, |
||||||
|
children: [ |
||||||
|
TextField( |
||||||
|
controller: streetNameController, |
||||||
|
decoration: InputDecoration( |
||||||
|
hintStyle: const TextStyle(color: Colors.blue), |
||||||
|
hintText: |
||||||
|
AppLocalizations.of(context)!.enter_your_address), |
||||||
|
), |
||||||
|
const SizedBox(height: 50), |
||||||
|
TextField( |
||||||
|
controller: commentsController, |
||||||
|
decoration: InputDecoration( |
||||||
|
hintStyle: const TextStyle(color: Colors.blue), |
||||||
|
hintText: AppLocalizations.of(context)! |
||||||
|
.enter_your_address_comments), |
||||||
|
), |
||||||
|
const SizedBox(height: 50), |
||||||
|
TextButton( |
||||||
|
onPressed: () { |
||||||
|
DBProvider.db |
||||||
|
.newAddress(Address( |
||||||
|
streetName: streetNameController.text, |
||||||
|
comments: commentsController.text)) |
||||||
|
.then((value) => Navigator.pop(context)); |
||||||
|
}, |
||||||
|
child: Text( |
||||||
|
AppLocalizations.of(context)!.add_new_address_button)) |
||||||
|
]), |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,145 @@ |
|||||||
|
# Project-level configuration. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
project(runner LANGUAGES CXX) |
||||||
|
|
||||||
|
# The name of the executable created for the application. Change this to change |
||||||
|
# the on-disk name of your application. |
||||||
|
set(BINARY_NAME "counters") |
||||||
|
# The unique GTK application identifier for this application. See: |
||||||
|
# https://wiki.gnome.org/HowDoI/ChooseApplicationID |
||||||
|
set(APPLICATION_ID "com.example.counters") |
||||||
|
|
||||||
|
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent |
||||||
|
# versions of CMake. |
||||||
|
cmake_policy(SET CMP0063 NEW) |
||||||
|
|
||||||
|
# Load bundled libraries from the lib/ directory relative to the binary. |
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") |
||||||
|
|
||||||
|
# Root filesystem for cross-building. |
||||||
|
if(FLUTTER_TARGET_PLATFORM_SYSROOT) |
||||||
|
set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Define build configuration options. |
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||||
|
set(CMAKE_BUILD_TYPE "Debug" CACHE |
||||||
|
STRING "Flutter build mode" FORCE) |
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS |
||||||
|
"Debug" "Profile" "Release") |
||||||
|
endif() |
||||||
|
|
||||||
|
# Compilation settings that should be applied to most targets. |
||||||
|
# |
||||||
|
# Be cautious about adding new options here, as plugins use this function by |
||||||
|
# default. In most cases, you should add new options to specific targets instead |
||||||
|
# of modifying this function. |
||||||
|
function(APPLY_STANDARD_SETTINGS TARGET) |
||||||
|
target_compile_features(${TARGET} PUBLIC cxx_std_14) |
||||||
|
target_compile_options(${TARGET} PRIVATE -Wall -Werror) |
||||||
|
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") |
||||||
|
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# Flutter library and tool build rules. |
||||||
|
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") |
||||||
|
add_subdirectory(${FLUTTER_MANAGED_DIR}) |
||||||
|
|
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
|
||||||
|
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") |
||||||
|
|
||||||
|
# Define the application target. To change its name, change BINARY_NAME above, |
||||||
|
# not the value here, or `flutter run` will no longer work. |
||||||
|
# |
||||||
|
# Any new source files that you add to the application should be added here. |
||||||
|
add_executable(${BINARY_NAME} |
||||||
|
"main.cc" |
||||||
|
"my_application.cc" |
||||||
|
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" |
||||||
|
) |
||||||
|
|
||||||
|
# Apply the standard set of build settings. This can be removed for applications |
||||||
|
# that need different build settings. |
||||||
|
apply_standard_settings(${BINARY_NAME}) |
||||||
|
|
||||||
|
# Add dependency libraries. Add any application-specific dependencies here. |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE flutter) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) |
||||||
|
|
||||||
|
# Run the Flutter tool portions of the build. This must not be removed. |
||||||
|
add_dependencies(${BINARY_NAME} flutter_assemble) |
||||||
|
|
||||||
|
# Only the install-generated bundle's copy of the executable will launch |
||||||
|
# correctly, since the resources must in the right relative locations. To avoid |
||||||
|
# people trying to run the unbundled copy, put it in a subdirectory instead of |
||||||
|
# the default top-level location. |
||||||
|
set_target_properties(${BINARY_NAME} |
||||||
|
PROPERTIES |
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
# Generated plugin build rules, which manage building the plugins and adding |
||||||
|
# them to the application. |
||||||
|
include(flutter/generated_plugins.cmake) |
||||||
|
|
||||||
|
|
||||||
|
# === Installation === |
||||||
|
# By default, "installing" just makes a relocatable bundle in the build |
||||||
|
# directory. |
||||||
|
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") |
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
||||||
|
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Start with a clean build bundle directory every time. |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
|
||||||
|
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") |
||||||
|
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") |
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) |
||||||
|
install(FILES "${bundled_library}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endforeach(bundled_library) |
||||||
|
|
||||||
|
# Copy the native assets provided by the build.dart from all packages. |
||||||
|
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") |
||||||
|
install(DIRECTORY "${NATIVE_ASSETS_DIR}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
# Fully re-copy the assets directory on each build to avoid having stale files |
||||||
|
# from a previous install. |
||||||
|
set(FLUTTER_ASSET_DIR_NAME "flutter_assets") |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) |
||||||
|
|
||||||
|
# Install the AOT library on non-Debug builds only. |
||||||
|
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") |
||||||
|
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endif() |
@ -0,0 +1,88 @@ |
|||||||
|
# This file controls Flutter-level build steps. It should not be edited. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
|
||||||
|
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") |
||||||
|
|
||||||
|
# Configuration provided via flutter tool. |
||||||
|
include(${EPHEMERAL_DIR}/generated_config.cmake) |
||||||
|
|
||||||
|
# TODO: Move the rest of this into files in ephemeral. See |
||||||
|
# https://github.com/flutter/flutter/issues/57146. |
||||||
|
|
||||||
|
# Serves the same purpose as list(TRANSFORM ... PREPEND ...), |
||||||
|
# which isn't available in 3.10. |
||||||
|
function(list_prepend LIST_NAME PREFIX) |
||||||
|
set(NEW_LIST "") |
||||||
|
foreach(element ${${LIST_NAME}}) |
||||||
|
list(APPEND NEW_LIST "${PREFIX}${element}") |
||||||
|
endforeach(element) |
||||||
|
set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# === Flutter Library === |
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) |
||||||
|
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) |
||||||
|
|
||||||
|
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") |
||||||
|
|
||||||
|
# Published to parent scope for install step. |
||||||
|
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) |
||||||
|
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) |
||||||
|
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) |
||||||
|
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) |
||||||
|
|
||||||
|
list(APPEND FLUTTER_LIBRARY_HEADERS |
||||||
|
"fl_basic_message_channel.h" |
||||||
|
"fl_binary_codec.h" |
||||||
|
"fl_binary_messenger.h" |
||||||
|
"fl_dart_project.h" |
||||||
|
"fl_engine.h" |
||||||
|
"fl_json_message_codec.h" |
||||||
|
"fl_json_method_codec.h" |
||||||
|
"fl_message_codec.h" |
||||||
|
"fl_method_call.h" |
||||||
|
"fl_method_channel.h" |
||||||
|
"fl_method_codec.h" |
||||||
|
"fl_method_response.h" |
||||||
|
"fl_plugin_registrar.h" |
||||||
|
"fl_plugin_registry.h" |
||||||
|
"fl_standard_message_codec.h" |
||||||
|
"fl_standard_method_codec.h" |
||||||
|
"fl_string_codec.h" |
||||||
|
"fl_value.h" |
||||||
|
"fl_view.h" |
||||||
|
"flutter_linux.h" |
||||||
|
) |
||||||
|
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") |
||||||
|
add_library(flutter INTERFACE) |
||||||
|
target_include_directories(flutter INTERFACE |
||||||
|
"${EPHEMERAL_DIR}" |
||||||
|
) |
||||||
|
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") |
||||||
|
target_link_libraries(flutter INTERFACE |
||||||
|
PkgConfig::GTK |
||||||
|
PkgConfig::GLIB |
||||||
|
PkgConfig::GIO |
||||||
|
) |
||||||
|
add_dependencies(flutter flutter_assemble) |
||||||
|
|
||||||
|
# === Flutter tool backend === |
||||||
|
# _phony_ is a non-existent file to force this command to run every time, |
||||||
|
# since currently there's no way to get a full input/output list from the |
||||||
|
# flutter tool. |
||||||
|
add_custom_command( |
||||||
|
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
||||||
|
COMMAND ${CMAKE_COMMAND} -E env |
||||||
|
${FLUTTER_TOOL_ENVIRONMENT} |
||||||
|
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
||||||
|
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
||||||
|
VERBATIM |
||||||
|
) |
||||||
|
add_custom_target(flutter_assemble DEPENDS |
||||||
|
"${FLUTTER_LIBRARY}" |
||||||
|
${FLUTTER_LIBRARY_HEADERS} |
||||||
|
) |
@ -0,0 +1,11 @@ |
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#include "generated_plugin_registrant.h" |
||||||
|
|
||||||
|
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry) { |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#ifndef GENERATED_PLUGIN_REGISTRANT_ |
||||||
|
#define GENERATED_PLUGIN_REGISTRANT_ |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
|
||||||
|
// Registers Flutter plugins.
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry); |
||||||
|
|
||||||
|
#endif // GENERATED_PLUGIN_REGISTRANT_
|
@ -0,0 +1,23 @@ |
|||||||
|
# |
||||||
|
# Generated file, do not edit. |
||||||
|
# |
||||||
|
|
||||||
|
list(APPEND FLUTTER_PLUGIN_LIST |
||||||
|
) |
||||||
|
|
||||||
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST |
||||||
|
) |
||||||
|
|
||||||
|
set(PLUGIN_BUNDLED_LIBRARIES) |
||||||
|
|
||||||
|
foreach(plugin ${FLUTTER_PLUGIN_LIST}) |
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) |
||||||
|
endforeach(plugin) |
||||||
|
|
||||||
|
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) |
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) |
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) |
||||||
|
endforeach(ffi_plugin) |
@ -0,0 +1,6 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
g_autoptr(MyApplication) app = my_application_new(); |
||||||
|
return g_application_run(G_APPLICATION(app), argc, argv); |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
#include <gdk/gdkx.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "flutter/generated_plugin_registrant.h" |
||||||
|
|
||||||
|
struct _MyApplication { |
||||||
|
GtkApplication parent_instance; |
||||||
|
char** dart_entrypoint_arguments; |
||||||
|
}; |
||||||
|
|
||||||
|
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) |
||||||
|
|
||||||
|
// Implements GApplication::activate.
|
||||||
|
static void my_application_activate(GApplication* application) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
GtkWindow* window = |
||||||
|
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); |
||||||
|
|
||||||
|
// Use a header bar when running in GNOME as this is the common style used
|
||||||
|
// by applications and is the setup most users will be using (e.g. Ubuntu
|
||||||
|
// desktop).
|
||||||
|
// If running on X and not using GNOME then just use a traditional title bar
|
||||||
|
// in case the window manager does more exotic layout, e.g. tiling.
|
||||||
|
// If running on Wayland assume the header bar will work (may need changing
|
||||||
|
// if future cases occur).
|
||||||
|
gboolean use_header_bar = TRUE; |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
GdkScreen* screen = gtk_window_get_screen(window); |
||||||
|
if (GDK_IS_X11_SCREEN(screen)) { |
||||||
|
const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); |
||||||
|
if (g_strcmp0(wm_name, "GNOME Shell") != 0) { |
||||||
|
use_header_bar = FALSE; |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
if (use_header_bar) { |
||||||
|
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); |
||||||
|
gtk_widget_show(GTK_WIDGET(header_bar)); |
||||||
|
gtk_header_bar_set_title(header_bar, "counters"); |
||||||
|
gtk_header_bar_set_show_close_button(header_bar, TRUE); |
||||||
|
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); |
||||||
|
} else { |
||||||
|
gtk_window_set_title(window, "counters"); |
||||||
|
} |
||||||
|
|
||||||
|
gtk_window_set_default_size(window, 1280, 720); |
||||||
|
gtk_widget_show(GTK_WIDGET(window)); |
||||||
|
|
||||||
|
g_autoptr(FlDartProject) project = fl_dart_project_new(); |
||||||
|
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); |
||||||
|
|
||||||
|
FlView* view = fl_view_new(project); |
||||||
|
gtk_widget_show(GTK_WIDGET(view)); |
||||||
|
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); |
||||||
|
|
||||||
|
fl_register_plugins(FL_PLUGIN_REGISTRY(view)); |
||||||
|
|
||||||
|
gtk_widget_grab_focus(GTK_WIDGET(view)); |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GApplication::local_command_line.
|
||||||
|
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
// Strip out the first argument as it is the binary name.
|
||||||
|
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); |
||||||
|
|
||||||
|
g_autoptr(GError) error = nullptr; |
||||||
|
if (!g_application_register(application, nullptr, &error)) { |
||||||
|
g_warning("Failed to register: %s", error->message); |
||||||
|
*exit_status = 1; |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
g_application_activate(application); |
||||||
|
*exit_status = 0; |
||||||
|
|
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GObject::dispose.
|
||||||
|
static void my_application_dispose(GObject* object) { |
||||||
|
MyApplication* self = MY_APPLICATION(object); |
||||||
|
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); |
||||||
|
G_OBJECT_CLASS(my_application_parent_class)->dispose(object); |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_class_init(MyApplicationClass* klass) { |
||||||
|
G_APPLICATION_CLASS(klass)->activate = my_application_activate; |
||||||
|
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; |
||||||
|
G_OBJECT_CLASS(klass)->dispose = my_application_dispose; |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_init(MyApplication* self) {} |
||||||
|
|
||||||
|
MyApplication* my_application_new() { |
||||||
|
return MY_APPLICATION(g_object_new(my_application_get_type(), |
||||||
|
"application-id", APPLICATION_ID, |
||||||
|
"flags", G_APPLICATION_NON_UNIQUE, |
||||||
|
nullptr)); |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
#ifndef FLUTTER_MY_APPLICATION_H_ |
||||||
|
#define FLUTTER_MY_APPLICATION_H_ |
||||||
|
|
||||||
|
#include <gtk/gtk.h> |
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, |
||||||
|
GtkApplication) |
||||||
|
|
||||||
|
/**
|
||||||
|
* my_application_new: |
||||||
|
* |
||||||
|
* Creates a new Flutter-based application. |
||||||
|
* |
||||||
|
* Returns: a new #MyApplication. |
||||||
|
*/ |
||||||
|
MyApplication* my_application_new(); |
||||||
|
|
||||||
|
#endif // FLUTTER_MY_APPLICATION_H_
|
@ -0,0 +1,347 @@ |
|||||||
|
# Generated by pub |
||||||
|
# See https://dart.dev/tools/pub/glossary#lockfile |
||||||
|
packages: |
||||||
|
async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: async |
||||||
|
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.11.0" |
||||||
|
boolean_selector: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: boolean_selector |
||||||
|
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
characters: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: characters |
||||||
|
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.0" |
||||||
|
clock: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: clock |
||||||
|
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.1" |
||||||
|
collection: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: collection |
||||||
|
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.18.0" |
||||||
|
cupertino_icons: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: cupertino_icons |
||||||
|
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.8" |
||||||
|
fake_async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: fake_async |
||||||
|
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.1" |
||||||
|
ffi: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: ffi |
||||||
|
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.0" |
||||||
|
flutter: |
||||||
|
dependency: "direct main" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_lints: |
||||||
|
dependency: "direct dev" |
||||||
|
description: |
||||||
|
name: flutter_lints |
||||||
|
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.0.3" |
||||||
|
flutter_localizations: |
||||||
|
dependency: "direct main" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_test: |
||||||
|
dependency: "direct dev" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
intl: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: intl |
||||||
|
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.18.1" |
||||||
|
js: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: js |
||||||
|
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.6.7" |
||||||
|
lints: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: lints |
||||||
|
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
matcher: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: matcher |
||||||
|
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.12.16" |
||||||
|
material_color_utilities: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: material_color_utilities |
||||||
|
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.5.0" |
||||||
|
meta: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: meta |
||||||
|
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.10.0" |
||||||
|
path: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: path |
||||||
|
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.8.3" |
||||||
|
path_provider: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: path_provider |
||||||
|
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.3" |
||||||
|
path_provider_android: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_provider_android |
||||||
|
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.2.4" |
||||||
|
path_provider_foundation: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_provider_foundation |
||||||
|
sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.3.2" |
||||||
|
path_provider_linux: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_provider_linux |
||||||
|
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.2.1" |
||||||
|
path_provider_platform_interface: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_provider_platform_interface |
||||||
|
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.2" |
||||||
|
path_provider_windows: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path_provider_windows |
||||||
|
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.2.1" |
||||||
|
platform: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: platform |
||||||
|
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.1.4" |
||||||
|
plugin_platform_interface: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: plugin_platform_interface |
||||||
|
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.8" |
||||||
|
sky_engine: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.99" |
||||||
|
source_span: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: source_span |
||||||
|
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.10.0" |
||||||
|
sqflite: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: sqflite |
||||||
|
sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.3.2" |
||||||
|
sqflite_aurora: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
path: "packages/sqflite/sqflite_aurora" |
||||||
|
ref: "sqflite_aurora-0.5.0" |
||||||
|
resolved-ref: "529306911d320e4b37391baa233842803173b3a1" |
||||||
|
url: "https://gitlab.com/omprussia/flutter/flutter-plugins.git" |
||||||
|
source: git |
||||||
|
version: "0.5.0" |
||||||
|
sqflite_common: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: sqflite_common |
||||||
|
sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.5.3" |
||||||
|
sqflite_common_ffi: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: sqflite_common_ffi |
||||||
|
sha256: "754927d82de369a6b9e760fb60640aa81da650f35ffd468d5a992814d6022908" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.3.2+1" |
||||||
|
sqlite3: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: sqlite3 |
||||||
|
sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.4.0" |
||||||
|
stack_trace: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stack_trace |
||||||
|
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.11.1" |
||||||
|
stream_channel: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stream_channel |
||||||
|
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.2" |
||||||
|
string_scanner: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: string_scanner |
||||||
|
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.0" |
||||||
|
synchronized: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: synchronized |
||||||
|
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.1.0+1" |
||||||
|
term_glyph: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: term_glyph |
||||||
|
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.1" |
||||||
|
test_api: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: test_api |
||||||
|
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.6.1" |
||||||
|
vector_math: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: vector_math |
||||||
|
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.4" |
||||||
|
web: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: web |
||||||
|
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.3.0" |
||||||
|
win32: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: win32 |
||||||
|
sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "5.2.0" |
||||||
|
xdg_directories: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: xdg_directories |
||||||
|
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.4" |
||||||
|
sdks: |
||||||
|
dart: ">=3.2.2 <4.0.0" |
||||||
|
flutter: ">=3.16.0" |
@ -0,0 +1,38 @@ |
|||||||
|
name: counters |
||||||
|
description: "A new Flutter project." |
||||||
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev |
||||||
|
version: 1.0.0+1 |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: '>=3.2.2 <4.0.0' |
||||||
|
|
||||||
|
dependencies: |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
|
||||||
|
|
||||||
|
cupertino_icons: ^1.0.2 |
||||||
|
sqflite: ^2.3.2 |
||||||
|
sqflite_aurora: |
||||||
|
git: |
||||||
|
url: https://gitlab.com/omprussia/flutter/flutter-plugins.git |
||||||
|
ref: sqflite_aurora-0.5.0 |
||||||
|
path: packages/sqflite/sqflite_aurora |
||||||
|
sqflite_common_ffi: any |
||||||
|
flutter_localizations: |
||||||
|
sdk: flutter |
||||||
|
intl: any |
||||||
|
path_provider: ^2.1.3 |
||||||
|
path: ^1.8.3 |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
flutter_lints: ^2.0.0 |
||||||
|
|
||||||
|
flutter: |
||||||
|
generate: true |
||||||
|
uses-material-design: true |
||||||
|
assets: |
||||||
|
- lib/l10n/app_en.arb |
||||||
|
- lib/l10n/app_ru.arb |
Loading…
Reference in new issue