example/lib/pages/link/link_page.dart (177 lines of code) (raw):
// Copyright © 2025 Alibaba Cloud. All rights reserved.
//
// Author: keria
// Date: 2025/2/19
// Brief: 链接设置页面
import 'package:aliplayer_widget_example/pages/link/link_constants.dart';
import 'package:aliplayer_widget_example/manager/sp_manager.dart';
import 'package:aliplayer_widget_example/pages/qrcode/qrcode_page.dart';
import 'package:flutter/material.dart';
/// 链接设置页面
class LinkPage extends StatefulWidget {
/// 可选的 LinkItem 列表参数
final List<LinkItem>? linkItems;
const LinkPage({
super.key,
this.linkItems,
});
@override
State<LinkPage> createState() => _LinkPageState();
}
class _LinkPageState extends State<LinkPage> {
// 数据源
late final List<LinkItem> items;
// 为每个item创建一个TextEditingController
late final List<TextEditingController> _controllers;
@override
void initState() {
super.initState();
// 初始化数据源
if (widget.linkItems != null && widget.linkItems!.isNotEmpty) {
// 如果传入了 linkItems,则使用传入的列表
items = List.from(widget.linkItems!);
} else {
// 否则使用默认的 LinkConstants.linkItems
items = LinkConstants.linkItems;
}
// 初始化TextEditingController列表
_controllers = List.generate(
items.length,
(index) => TextEditingController(),
);
// 加载保存的链接数据
_loadSavedLinks();
}
@override
void dispose() {
// 释放所有TextEditingController
for (var controller in _controllers) {
controller.dispose();
}
super.dispose();
}
// 更新链接的方法
void updateLink(int index, String newLink) {
setState(() {
items[index].link = newLink;
});
}
// 加载保存的链接数据
Future<void> _loadSavedLinks() async {
for (int i = 0; i < items.length; i++) {
var name = items[i].name;
final savedLink = SPManager.instance.getString(name);
if (savedLink != null) {
setState(() {
items[i].link = savedLink; // 更新数据模型
_controllers[i].text = savedLink; // 更新 TextField 的内容
});
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('链接设置页面'),
actions: [
IconButton(
icon: const Icon(Icons.save),
onPressed: onSavePressed,
),
],
),
body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(), // 点击页面任何地方收起键盘
child: _buildContentBody(),
),
floatingActionButton: (widget.linkItems?.isNotEmpty == true)
? FloatingActionButton(
onPressed: _onFloatButtonPressed,
child: const Icon(Icons.arrow_forward_rounded),
)
: null,
);
}
/// 构建主体内容
Widget _buildContentBody() {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
return Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 固定长度的文字
Text(
item.name,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
// 输入框和扫码按钮
Row(
children: [
Expanded(
child: TextField(
controller: _controllers[index],
onChanged: (value) => updateLink(index, value),
decoration: InputDecoration(
hintText: '请输入链接',
suffixIcon: IconButton(
icon: const Icon(Icons.clear),
onPressed: () {
_controllers[index].clear(); // 清空输入框
updateLink(index, '');
},
),
),
),
),
const SizedBox(width: 8),
ElevatedButton.icon(
onPressed: () => onQrCodePressed(index), // 传递当前 item 的索引
icon: const Icon(Icons.qr_code_rounded),
label: const Text('扫码'),
),
],
),
],
),
);
},
);
}
/// 保存按钮点击事件
void onSavePressed() {
// 保存所有链接
for (var item in items) {
SPManager.instance.saveString(item.name, item.link);
}
// 显示保存成功的提示
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('链接已保存'),
backgroundColor: Colors.green,
duration: Duration(seconds: 2),
),
);
// 返回上一级页面
_navigateBack();
}
/// 二维码按钮点击事件
Future<void> onQrCodePressed(int index) async {
// 跳转到二维码页面,并等待扫码结果
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const QRCodePage()),
);
// 如果扫码结果不为空,则更新对应的 TextField 和数据模型
if (result != null && result is String) {
setState(() {
items[index].link = result; // 更新数据模型
_controllers[index].text = result; // 更新 TextField 的内容
});
}
}
/// 浮动按钮点击事件
void _onFloatButtonPressed() {
bool hasLinkFilled = false;
for (var item in items) {
if (item.link.isNotEmpty) {
hasLinkFilled = true;
// 保存链接
SPManager.instance.saveString(item.name, item.link);
continue;
}
}
// 如果有链接填写,则跳转到目标页面
if (hasLinkFilled) {
// 跳转到目标页面
Navigator.pushReplacementNamed(context, items.firstOrNull?.route ?? "");
} else {
// 提示用户输入链接
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('请先输入链接'),
backgroundColor: Colors.red,
),
);
}
}
/// 返回上一级页面
void _navigateBack() {
// 使用 pop 返回上一级页面
Navigator.pop(context);
}
}