Сергей Марков
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