feat:增加TDesign组件库

This commit is contained in:
2026-01-05 15:33:43 +08:00
parent 2b334edf2f
commit 00c8e82a65
18 changed files with 364 additions and 304 deletions

View File

@@ -1,7 +1,14 @@
class AppConfig { class AppConfig {
static const int initWeight = 73; static const double initWeight = 73;
static const int goalWeight = 72; static const double minWeight = 70;
static const int goalTotalSpot = 400; static const double maxWeight = 75;
static const double goalWeight = 72;
static const double initSpot = 30;
static const double minSpot = 10;
static const double maxSpot = 120;
static const double goalTotalSpot = 400;
static const int goalAvgSleep = 8; static const int goalAvgSleep = 8;
static const List<String> sportProjectList = ['羽毛球', '乒乓球', '跑步']; static const List<String> sportProjectList = ['羽毛球', '乒乓球', '跑步'];

View File

@@ -48,9 +48,9 @@ class HealthRecord extends HiveObject {
HealthRecord copyWith({ HealthRecord copyWith({
int? id, int? id,
num? weight, double? weight,
String? sportProject, String? sportProject,
num? sportDuration, double? sportDuration,
String? sleepStartTime, String? sleepStartTime,
String? sleepEndTime, String? sleepEndTime,
String? date, String? date,

View File

@@ -8,8 +8,8 @@ class HealthProvider with ChangeNotifier {
RecordType type = RecordType.weight; RecordType type = RecordType.weight;
bool isEditing = false; bool isEditing = false;
num latestWeight = 0; double latestWeight = 0;
num totalSpot = 0; double totalSpot = 0;
num avgSleep = 0; num avgSleep = 0;
void initForm(HealthRecord record) { void initForm(HealthRecord record) {
@@ -52,12 +52,12 @@ class HealthProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void updateLatestWeight(num weight) { void updateLatestWeight(double weight) {
latestWeight = weight; latestWeight = weight;
notifyListeners(); notifyListeners();
} }
void updateTotalSpot(num duration) { void updateTotalSpot(double duration) {
totalSpot = duration; totalSpot = duration;
notifyListeners(); notifyListeners();
} }

View File

@@ -43,10 +43,10 @@ class HealthService {
} }
// 获取总运动时长 // 获取总运动时长
num getTotalSport() { double getTotalSport() {
int year = DateTime.now().year; int year = DateTime.now().year;
int month = DateTime.now().month; int month = DateTime.now().month;
num totalDuration = 0; double totalDuration = 0;
for (final record in getAllRecords()) { for (final record in getAllRecords()) {
if (record.sportDuration != 0) { if (record.sportDuration != 0) {
@@ -88,12 +88,12 @@ class HealthService {
} }
// 获取最新体重 // 获取最新体重
num getLatestWeight() { double getLatestWeight() {
final records = getAllRecordsOrderByDate(); final records = getAllRecordsOrderByDate();
for (final record in records) { for (final record in records) {
if (record.weight != 0) { if (record.weight != 0) {
return record.weight; return record.weight.toDouble();
} }
} }

View File

@@ -113,7 +113,7 @@ String formatContent(HealthRecord record, RecordType type) {
late String title; late String title;
switch (type) { switch (type) {
case RecordType.weight: case RecordType.weight:
title = "${record.weight} ${type.unit}"; title = "${record.weight.toStringAsFixed(1)} ${type.unit}";
case RecordType.sport: case RecordType.sport:
title = "${record.sportProject} · ${record.sportDuration} ${type.unit}"; title = "${record.sportProject} · ${record.sportDuration} ${type.unit}";
case RecordType.sleep: case RecordType.sleep:
@@ -131,3 +131,10 @@ String formatContent(HealthRecord record, RecordType type) {
return title; return title;
} }
String getTimeFromSelectDate(Map<String, int> selected) {
final String hour = selected['hour'].toString().padLeft(2, '0');
final String minute = selected['minute'].toString().padLeft(2, '0');
return '${hour}:${minute}';
}

View File

@@ -1,157 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:intl/intl.dart';
TextStyle _titleStyle() {
return TextStyle(fontSize: 16, fontWeight: FontWeight.w600);
}
TextStyle _contentStyle() {
return TextStyle(fontSize: 16, fontWeight: FontWeight.w500);
}
OutlineInputBorder _border(ColorScheme colors) {
return OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: colors.onSurface.withAlpha(100), width: 1.5),
);
}
OutlineInputBorder _enabledBorder(ColorScheme colors) {
return OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: colors.onSurface.withAlpha(100), width: 1.5),
);
}
OutlineInputBorder _focusedBorder(ColorScheme colors) {
return OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: colors.primary, width: 2),
);
}
EdgeInsetsGeometry _containerPadding() {
return EdgeInsets.symmetric(horizontal: 16, vertical: 10);
}
Widget buildFormTime({
required BuildContext context,
required String name,
required String title,
required DateTime? initialValue,
required ValueChanged<DateTime?> onChanged,
double width = 100,
String hintText = '请选择时间',
}) {
final colors = Theme.of(context).colorScheme;
final alphaColor = colors.onSurface.withAlpha(100);
return Row(
children: [
Container(width: width, child: Text(title, style: _titleStyle())),
const SizedBox(width: 8),
Expanded(
child: FormBuilderDateTimePicker(
name: name,
inputType: InputType.time,
initialTime: TimeOfDay.now(),
initialValue: initialValue,
format: DateFormat.Hm(),
onChanged: (value) => onChanged(value),
style: _contentStyle(),
decoration: InputDecoration(
hintText: hintText,
hintStyle: TextStyle(color: alphaColor),
prefixIcon: Icon(Icons.schedule_rounded, size: 24),
border: _border(colors),
enabledBorder: _enabledBorder(colors),
focusedBorder: _focusedBorder(colors),
filled: true,
fillColor: colors.surfaceContainer,
contentPadding: _containerPadding(),
),
),
),
],
);
}
Widget buildFormSlider({
required BuildContext context,
required String name,
required String title,
required String label,
required double min,
required double max,
required double initialValue,
required int divisions,
required ValueChanged<double?> onChanged,
double width = 100,
}) {
final colors = Theme.of(context).colorScheme;
final alphaColor = colors.onSurface.withAlpha(100);
return Row(
children: [
Container(width: width, child: Text(title, style: _titleStyle())),
const SizedBox(width: 8),
Expanded(
child: FormBuilderSlider(
name: name,
min: min,
max: max,
initialValue: initialValue,
divisions: divisions,
onChanged: (value) => onChanged(value),
label: label,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.zero,
),
),
),
],
);
}
Widget buildFormRadioGroup({
required BuildContext context,
required String name,
required String title,
required String initialValue,
required List<String> items,
required ValueChanged<String?> onChanged,
double width = 100,
}) {
final colors = Theme.of(context).colorScheme;
final alphaColor = colors.onSurface.withAlpha(100);
return Row(
children: [
Container(width: width, child: Text(title, style: _titleStyle())),
const SizedBox(width: 8),
Expanded(
child: FormBuilderRadioGroup<String>(
name: name,
options:
items
.map(
(item) =>
FormBuilderFieldOption(value: item, child: Text(item)),
)
.toList(),
initialValue: initialValue,
activeColor: colors.primary,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.zero,
),
onChanged: (value) => onChanged(value),
),
),
],
);
}

View File

@@ -1,6 +1,5 @@
import 'package:fitnote/utils/record_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:getwidget/getwidget.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart';
Widget buildCardTitle({ Widget buildCardTitle({
required BuildContext context, required BuildContext context,
@@ -70,17 +69,14 @@ Widget buildProgressItem({
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
GFProgressBar( TDProgress(
animation: true, type: TDProgressType.linear,
lineHeight: 20, progressStatus: TDProgressStatus.primary,
percentage: progress, value: progress,
progressBarColor: color, color: color,
child: Text( strokeWidth: 20,
'${roundNum(progress * 100)}%', progressLabelPosition: TDProgressLabelPosition.inside,
textAlign: TextAlign.end, )
style: TextStyle(color: Colors.white),
),
),
], ],
); );
} }

View File

@@ -51,7 +51,7 @@ class _GoalProgressState extends State<GoalProgress> {
const SizedBox(height: 28), const SizedBox(height: 28),
buildProgressItem( buildProgressItem(
title: '目标体重', title: '目标体重',
current: provider.latestWeight.toString(), current: provider.latestWeight.toStringAsFixed(1),
target: AppConfig.goalWeight.toString(), target: AppConfig.goalWeight.toString(),
unit: RecordType.weight.unit, unit: RecordType.weight.unit,
progress: calWeightProgress( progress: calWeightProgress(

View File

@@ -9,9 +9,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_common/flutter_common.dart'; import 'package:flutter_common/flutter_common.dart';
import 'package:flutter_common/widget/common_widget.dart'; import 'package:flutter_common/widget/common_widget.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:getwidget/getwidget.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
class RecordDaily extends StatefulWidget { class RecordDaily extends StatefulWidget {
const RecordDaily({super.key}); const RecordDaily({super.key});
@@ -172,7 +172,7 @@ class _RecordDailyState extends State<RecordDaily> {
break; break;
case RecordType.sport: case RecordType.sport:
provider.updateSportProject(AppConfig.sportProjectList[0]); provider.updateSportProject(AppConfig.sportProjectList[0]);
provider.updateSportDuration(30); provider.updateSportDuration(AppConfig.initSpot);
break; break;
case RecordType.sleep: case RecordType.sleep:
provider.updateSleepStartTime(''); provider.updateSleepStartTime('');
@@ -202,64 +202,44 @@ class _RecordDailyState extends State<RecordDaily> {
return Row( return Row(
children: [ children: [
Expanded( Expanded(
child: GFButton( child: TDButton(
onPressed: () { text: '取消',
theme: TDButtonTheme.light,
onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
_resetRecord();
}, },
color: Colors.grey,
text: "取消",
), ),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: GFButton( child: TDButton(
onPressed: () { text: '删除',
theme: TDButtonTheme.danger,
onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
_deleteRecord(type); _deleteRecord(type);
}, },
color: Colors.red,
text: "删除",
), ),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: GFButton( child: TDButton(
onPressed: () { text: '确定',
theme: TDButtonTheme.primary,
onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
_saveRecord(); _saveRecord();
}, },
color: colors.primary,
text: "确定",
), ),
), ),
], ],
); );
} }
void _resetRecord() { void _deleteRecord(RecordType type) async {
final provider = context.read<HealthProvider>();
if (!provider.isEditing) {
switch (provider.type) {
case RecordType.weight:
provider.updateWeight(0);
break;
case RecordType.sport:
provider.updateSportProject('跑步');
provider.updateSportDuration(0);
break;
case RecordType.sleep:
provider.updateSleepStartTime('');
provider.updateSleepEndTime('');
break;
}
}
}
void _deleteRecord(RecordType type) async{
final provider = context.read<HealthProvider>(); final provider = context.read<HealthProvider>();
switch(type) { switch (type) {
case RecordType.weight: case RecordType.weight:
provider.updateWeight(0); provider.updateWeight(0);
break; break;
@@ -351,7 +331,9 @@ class _RecordDailyState extends State<RecordDaily> {
String startTime = record.sleepStartTime; String startTime = record.sleepStartTime;
String endTime = record.sleepEndTime; String endTime = record.sleepEndTime;
num difference = calSleepMinDuration(startTime, endTime) - lastValue; num difference = calSleepMinDuration(startTime, endTime) - lastValue;
String formattedDiff = NumberFormat('+0.00;-0.00').format(difference / 60); String formattedDiff = NumberFormat(
'+0.00;-0.00',
).format(difference / 60);
change = '较上次 $formattedDiff ${type.unit}'; change = '较上次 $formattedDiff ${type.unit}';
break; break;
} }

View File

@@ -3,9 +3,9 @@ import 'package:fitnote/models/health.dart';
import 'package:fitnote/provider/health_provider.dart'; import 'package:fitnote/provider/health_provider.dart';
import 'package:fitnote/service/health_service.dart'; import 'package:fitnote/service/health_service.dart';
import 'package:fitnote/utils/record_utils.dart'; import 'package:fitnote/utils/record_utils.dart';
import 'package:fitnote/widget/form.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
class RecordForm extends StatefulWidget { class RecordForm extends StatefulWidget {
final RecordType type; final RecordType type;
@@ -63,6 +63,88 @@ class _RecordFormState extends State<RecordForm> {
); );
} }
Widget _buildFormSleepContent(HealthProvider provider) {
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
return TDCellGroup(
theme: TDCellGroupTheme.cardTheme,
cells: [
TDCell(
title: '入睡时间',
note: startTime,
arrow: true,
leftIcon: Icons.access_alarm,
onClick: (click) {
TDPicker.showDatePicker(
context,
title: '选择时间',
onConfirm: (selected) {
provider.updateSleepStartTime(getTimeFromSelectDate(selected));
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
calSleepDuration(startTime, endTime);
Navigator.of(context).pop();
},
useYear: false,
useMonth: false,
useDay: false,
useHour: true,
useMinute: true,
useSecond: false,
dateStart: [1999, 01, 01],
dateEnd: [2099, 12, 31],
initialDate: [
DateTime.now().year,
DateTime.now().month,
DateTime.now().day,
DateTime.now().hour,
DateTime.now().minute,
],
);
},
),
TDCell(
title: '起床时间',
note: endTime,
arrow: true,
leftIcon: Icons.access_alarm,
onClick: (click) {
TDPicker.showDatePicker(
context,
title: '选择时间',
onConfirm: (selected) {
provider.updateSleepEndTime(getTimeFromSelectDate(selected));
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
calSleepDuration(startTime, endTime);
Navigator.of(context).pop();
},
useYear: false,
useMonth: false,
useDay: false,
useHour: true,
useMinute: true,
useSecond: false,
dateStart: [1999, 01, 01],
dateEnd: [2099, 12, 31],
initialDate: [
DateTime.now().year,
DateTime.now().month,
DateTime.now().day,
DateTime.now().hour,
DateTime.now().minute,
],
);
},
),
],
);
}
Widget _buildFormContent() { Widget _buildFormContent() {
final provider = context.watch<HealthProvider>(); final provider = context.watch<HealthProvider>();
@@ -73,16 +155,24 @@ class _RecordFormState extends State<RecordForm> {
children: [ children: [
_buildFormTitle('记录体重'), _buildFormTitle('记录体重'),
SizedBox(height: 20), SizedBox(height: 20),
buildFormSlider( TDSlider(
context: context, boxDecoration: BoxDecoration(
name: 'slider', color: Colors.white,
title: '体重Kg', borderRadius: BorderRadius.circular(12),
label: provider.formItem.weight.toString(), ),
min: 70, sliderThemeData: TDSliderThemeData.capsule(
max: 75, context: context,
initialValue: 72, scaleFormatter: (double value) {
divisions: 50, return '${value.toStringAsFixed(1)} Kg';
onChanged: (value) => provider.updateWeight(value!), },
showThumbValue: true,
min: AppConfig.minWeight,
max: AppConfig.maxWeight,
),
value: provider.formItem.weight.toDouble(),
leftLabel: AppConfig.minWeight.toString(),
rightLabel: AppConfig.maxWeight.toString(),
onChanged: (value) => provider.updateWeight(value),
), ),
SizedBox(height: 10), SizedBox(height: 10),
], ],
@@ -93,63 +183,62 @@ class _RecordFormState extends State<RecordForm> {
children: [ children: [
_buildFormTitle('记录运动'), _buildFormTitle('记录运动'),
SizedBox(height: 24), SizedBox(height: 24),
buildFormRadioGroup( TDRadioGroup(
context: context, selectId:
title: '运动类型', AppConfig.sportProjectList
name: 'sport', .indexOf(provider.formItem.sportProject)
initialValue: provider.formItem.sportProject, .toString(),
items: AppConfig.sportProjectList, passThrough: true,
onChanged: (value) => provider.updateSportProject(value!), child: ListView.builder(
padding: const EdgeInsets.all(0),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return TDRadio(
id: index.toString(),
title: AppConfig.sportProjectList[index],
);
},
itemCount: AppConfig.sportProjectList.length,
),
onRadioGroupChange:
(value) => {
provider.updateSportProject(
AppConfig.sportProjectList[int.parse(value!)],
),
},
), ),
SizedBox(height: 10), SizedBox(height: 10),
buildFormSlider( TDSlider(
context: context, boxDecoration: BoxDecoration(
name: 'slider', color: Colors.white,
title: '时长(分钟)', borderRadius: BorderRadius.circular(12),
label: provider.formItem.sportDuration.toString(), ),
min: 0, sliderThemeData: TDSliderThemeData.capsule(
max: 120, context: context,
initialValue: 30, scaleFormatter: (double value) {
divisions: 12, return '${value.toStringAsFixed(0)} 分钟';
onChanged: (value) => provider.updateSportDuration(value!), },
showThumbValue: true,
divisions: 11,
min: AppConfig.minSpot,
max: AppConfig.maxSpot,
),
value: provider.formItem.sportDuration.toDouble(),
leftLabel: AppConfig.minSpot.toString(),
rightLabel: AppConfig.maxSpot.toString(),
onChanged: (value) => provider.updateSportDuration(value),
), ),
SizedBox(height: 10), SizedBox(height: 10),
], ],
); );
case RecordType.sleep: case RecordType.sleep:
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_buildFormTitle('记录睡眠'), _buildFormTitle('记录睡眠'),
SizedBox(height: 24), SizedBox(height: 24),
buildFormTime( _buildFormSleepContent(provider),
context: context,
name: 'startTime',
title: '入睡时间',
initialValue: timeOfDayToDateTime(parseTime(startTime)),
onChanged: (time) {
provider.updateSleepStartTime(formatTime(time!));
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
calSleepDuration(startTime, endTime);
},
),
SizedBox(height: 10),
buildFormTime(
context: context,
name: 'endTime',
title: '起床时间',
initialValue: timeOfDayToDateTime(parseTime(endTime)),
onChanged: (time) {
provider.updateSleepEndTime(formatTime(time!));
final startTime = provider.formItem.sleepStartTime;
final endTime = provider.formItem.sleepEndTime;
calSleepDuration(startTime, endTime);
},
),
SizedBox(height: 10), SizedBox(height: 10),
_buildSleepDuration(provider.formItem), _buildSleepDuration(provider.formItem),
SizedBox(height: 10), SizedBox(height: 10),

View File

@@ -1,9 +1,6 @@
import 'package:fitnote/provider/health_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_common/widget/common_widget.dart'; import 'package:flutter_common/widget/common_widget.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class Welcome extends StatefulWidget { class Welcome extends StatefulWidget {
const Welcome({super.key}); const Welcome({super.key});

View File

@@ -6,9 +6,13 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <rive_native/rive_native_plugin.h> #include <rive_native/rive_native_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) rive_native_registrar = g_autoptr(FlPluginRegistrar) rive_native_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "RiveNativePlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "RiveNativePlugin");
rive_native_plugin_register_with_registrar(rive_native_registrar); rive_native_plugin_register_with_registrar(rive_native_registrar);

View File

@@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
rive_native rive_native
) )

View File

@@ -6,6 +6,7 @@ import FlutterMacOS
import Foundation import Foundation
import file_picker import file_picker
import file_selector_macos
import flutter_image_compress_macos import flutter_image_compress_macos
import path_provider_foundation import path_provider_foundation
import rive_native import rive_native
@@ -13,6 +14,7 @@ import shared_preferences_foundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin")) FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RiveNativePlugin.register(with: registry.registrar(forPlugin: "RiveNativePlugin")) RiveNativePlugin.register(with: registry.registrar(forPlugin: "RiveNativePlugin"))

View File

@@ -191,7 +191,7 @@ packages:
source: hosted source: hosted
version: "3.0.7" version: "3.0.7"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: transitive
description: description:
name: cupertino_icons name: cupertino_icons
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
@@ -230,6 +230,14 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
easy_refresh:
dependency: transitive
description:
name: easy_refresh
sha256: "486e30abfcaae66c0f2c2798a10de2298eb9dc5e0bb7e1dba9328308968cae0c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -262,6 +270,38 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "10.3.7" version: "10.3.7"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.3+2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.4+4"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.7.0"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.3+4"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@@ -359,6 +399,22 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.31" version: "2.0.31"
flutter_slidable:
dependency: transitive
description:
name: flutter_slidable
sha256: a857de7ea701f276fd6a6c4c67ae885b60729a3449e42766bb0e655171042801
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
flutter_swiper_null_safety:
dependency: transitive
description:
name: flutter_swiper_null_safety
sha256: "5a855e0080d035c08e82f8b7fd2f106344943a30c9ab483b2584860a2f22eaaf"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -401,14 +457,6 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
getwidget:
dependency: "direct main"
description:
name: getwidget
sha256: ab0201d6c1d27b508f05fa571e0e5038d60a603fd80303002b882f18b1c77231
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.0"
glob: glob:
dependency: transitive dependency: transitive
description: description:
@@ -473,14 +521,70 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.1.2" version: "4.1.2"
infinite_listview: image_picker:
dependency: transitive dependency: "direct overridden"
description: description:
name: infinite_listview name: image_picker
sha256: f6062c1720eb59be553dfa6b89813d3e8dd2f054538445aaa5edaddfa5195ce6 sha256: "1f498d086203360cca099d20ffea2963f48c39ce91bdd8a3b6d4a045786b02c8"
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.0.8"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.8.12+23"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.0"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.8.13"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.11.1"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -617,14 +721,6 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
numberpicker:
dependency: "direct main"
description:
name: numberpicker
sha256: "4c129154944b0f6b133e693f8749c3f8bfb67c4d07ef9dcab48b595c22d1f156"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
package_config: package_config:
dependency: transitive dependency: transitive
description: description:
@@ -641,6 +737,22 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.9.1" version: "1.9.1"
path_drawing:
dependency: transitive
description:
name: path_drawing
sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
path_provider: path_provider:
dependency: transitive dependency: transitive
description: description:
@@ -926,6 +1038,22 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
tdesign_flutter:
dependency: "direct main"
description:
name: tdesign_flutter
sha256: cf166a5fdbbfd9129305d2c2906633c8d0151bbb2d0a6fbcf901bdd76726a555
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.6"
tdesign_flutter_adaptation:
dependency: "direct overridden"
description:
name: tdesign_flutter_adaptation
sha256: "8c5ba936abd2651472495b19dd23c525f04fb2eac6ba23de55a8b63a7c226deb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.16.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:

View File

@@ -1 +1 @@
name: fitnote name: fitnote

View File

@@ -6,9 +6,12 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_windows/file_selector_windows.h>
#include <rive_native/rive_native_plugin.h> #include <rive_native/rive_native_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
RiveNativePluginRegisterWithRegistrar( RiveNativePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("RiveNativePlugin")); registry->GetRegistrarForPlugin("RiveNativePlugin"));
} }

View File

@@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_windows
rive_native rive_native
) )