Flutter原生Activity交互插件activity的使用
根据您提供的内容,下面是关于“Flutter原生Activity交互插件activity的使用”的详细示例代码:
Flutter原生Activity交互插件activity的使用
引言
在本示例中,我们将展示如何使用activity
插件来实现一个简单的任务管理应用。该应用可以添加、编辑和删除任务。
添加依赖
首先,在pubspec.yaml
文件中添加activity
依赖:
dependencies:
activity: ^1.5.2+4
创建控制器
创建一个控制器类TaskController
,继承自ActiveController
:
import 'package:activity/activity.dart';
class TaskController extends ActiveController {
// 定义任务列表
final tasks = ActiveList([], typeName: 'tasks');
// 用户名控制器
final userName = TextEditingController(text: '');
// 用户邮箱控制器
final userEmail = TextEditingController(text: '');
// 任务名称控制器
final taskName = TextEditingController(text: '');
// 任务内容控制器
final taskBody = TextEditingController(text: '');
// 任务级别控制器
final taskLevel = TextEditingController(text: '');
// 初始化计算
void initCalculations() {
// 这里可以进行一些初始化计算
}
// 验证JSON数据
void validateJSON() {
// 验证逻辑
}
// 保存条目
void saveEntry() {
tasks.value.add({
'name': taskName.text,
'body': taskBody.text,
'level': int.parse(taskLevel.text),
'user': {
'name': userName.text,
'email': userEmail.text
}
});
}
// 编辑用户任务
void editUserTask(ActiveModel<Task> task, int index) {
tasks.value[index] = {
'name': taskName.text,
'body': taskBody.text,
'level': int.parse(taskLevel.text),
'user': {
'name': userName.text,
'email': userEmail.text
}
};
}
// 删除用户任务
void deleteUserTask(ActiveModel<Task> task) {
tasks.value.removeWhere((element) => element['name'] == task.value.name);
}
}
创建视图
创建一个视图类TaskView
,继承自ActiveView
:
import 'package:activity/activity.dart';
class TaskView extends ActiveView<TaskController> {
const TaskView({super.key, required super.activeController});
[@override](/user/override)
ActiveState<ActiveView<TaskController>, TaskController> createActivity() =>
_TaskViewState(activeController);
}
创建状态类
创建一个状态类_TaskViewState
,继承自ActiveState
:
class _TaskViewState extends ActiveState<TaskView, TaskController> {
_TaskViewState(TaskController activeController) : super(activeController);
[@override](/user/override)
void initState() {
super.initState();
activeController.initCalculations();
activeController.validateJSON();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: true,
title: 'Activity Task App',
theme: ThemeData(
primarySwatch: activeController.tasks.value.length > 100 ? Colors.red : Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Scaffold(
appBar: AppBar(
title: Text('Activity App'),
),
body: SafeArea(
child: Column(
children: [
TextButton(
onPressed: () {
double width = context.size!.width;
double height = context.size!.height;
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Add User Task'),
content: SizedBox(
width: width,
height: height,
child: userTaskForm(activeController.globalKey),
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'Cancel'),
child: const Text('Cancel'),
),
TextButton(
onPressed: () {
Navigator.pop(context, 'OK');
if (activeController.userName.text.isNotEmpty &&
activeController.userEmail.text.isNotEmpty &&
activeController.taskName.text.isNotEmpty &&
activeController.taskBody.text.isNotEmpty) {
activeController.saveEntry();
}
},
child: const Text('OK'),
),
],
),
);
},
child: const Text('Add Task'),
),
Container(
margin: const EdgeInsets.only(top: 10, bottom: 10, right: 10, left: 10),
child: Card(
child: SizedBox(
height: 50,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(activeController.tasks.value.length.toString()),
const Text(
'Total tasks',
style: TextStyle(fontSize: 8),
),
],
),
const SizedBox(width: 50,),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(activeController.tasks.value.length.toString()),
const Text(
'Total task level : Max > 100',
style: TextStyle(fontSize: 8),
),
],
),
],
),
),
),
),
ifRunning(
const CircularProgressIndicator(),
otherwise: Expanded(
child: Align(
alignment: Alignment.topCenter,
child: ListView.builder(
reverse: true,
shrinkWrap: true,
itemCount: activeController.tasks.value.length,
itemBuilder: (context, i) {
final taskModel = activeController.tasks.value[i];
return ListTile(
title: Text(taskModel['name']),
subtitle: Text(taskModel['body']),
leading: IconButton(
onPressed: () {
activeController.userName.text = taskModel['user']['name'];
activeController.userEmail.text = taskModel['user']['email'];
activeController.taskName.text = taskModel['name'];
activeController.taskBody.text = taskModel['body'];
activeController.taskLevel.text = taskModel['level'].toString();
showDialog<String>(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Edit ${taskModel['name']} Task'),
content: SizedBox(
height: 600,
width: 600,
child: userTaskForm(activeController.globalKey),
),
actions: <Widget>[
TextButton(
onPressed: () {
activeController.userName.clear();
activeController.userEmail.clear();
activeController.taskName.clear();
activeController.taskBody.clear();
activeController.taskLevel.clear();
Navigator.pop(context, 'Cancel');
},
child: const Text('Cancel'),
),
TextButton(
onPressed: () {
if (activeController.userName.text.isNotEmpty &&
activeController.userEmail.text.isNotEmpty &&
activeController.taskName.text.isNotEmpty &&
activeController.taskLevel.text.isNotEmpty &&
activeController.taskBody.text.isNotEmpty) {
activeController.editUserTask(taskModel, i);
}
Navigator.pop(context, 'Cancel');
},
child: const Text('SUBMIT'),
),
],
);
},
);
},
icon: const Icon(Icons.edit),
),
trailing: IconButton(
onPressed: () {
showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text(taskModel['name']),
content: const Text('Are you sure you want to delete this task.?'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, 'Cancel'),
child: const Text('Cancel'),
),
TextButton(
onPressed: () {
Navigator.pop(context, 'OK');
activeController.deleteUserTask(taskModel);
},
child: const Text('OK'),
),
],
),
);
},
icon: const Icon(
Icons.delete,
color: Colors.deepOrange,
),
),
);
},
),
),
),
),
],
),
),
),
);
}
Widget userTaskForm(GlobalKey globalKey) {
return Form(
key: globalKey,
child: Container(
margin: const EdgeInsets.all(10),
child: ListView(
children: [
TextField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'User Name',
),
controller: activeController.userName,
),
const Divider(height: 10),
TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'User Email',
),
controller: activeController.userEmail,
),
const Divider(height: 10),
TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Task Name',
),
controller: activeController.taskName,
),
const Divider(height: 10),
TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Task Body',
),
controller: activeController.taskBody,
),
const Divider(height: 10),
TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Task Level',
),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"[0-9]")),
],
controller: activeController.taskLevel,
),
const Divider(height: 20),
],
),
),
);
}
}
主应用类
创建主应用类MyApp
:
import 'package:flutter/material.dart';
import 'package:activity/activity.dart';
import 'controller.dart';
import 'task_controller.dart';
import 'task_view.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Activity Task App',
theme: ThemeData(primarySwatch: Colors.blue),
home: Activity(
TaskController(),
onActivityStateChanged: () => DateTime.now().microsecondsSinceEpoch.toString(),
child: TaskView(
activeController: TaskController(),
),
),
);
}
}
更多关于Flutter原生Activity交互插件activity的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter原生Activity交互插件activity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,如果你需要与Android的原生Activity进行交互,可以使用flutter_activity
插件。这个插件允许你在Flutter应用中启动和与Android的Activity进行通信。以下是如何使用flutter_activity
插件的步骤:
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加flutter_activity
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_activity: ^0.0.1 # 请使用最新版本
然后运行flutter pub get
来安装依赖。
2. 创建Android原生Activity
在Android项目的android/app/src/main/java/com/example/your_app
目录下创建一个新的Activity。例如,创建一个名为MyActivity.java
的Activity:
package com.example.your_app;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my); // 设置布局文件
}
}
确保在AndroidManifest.xml
中注册这个Activity:
<activity android:name=".MyActivity" />
3. 在Flutter中启动Activity
在Flutter代码中,你可以使用flutter_activity
插件来启动这个Activity。首先,导入插件:
import 'package:flutter_activity/flutter_activity.dart';
然后,使用FlutterActivity.launch
方法来启动Activity:
ElevatedButton(
onPressed: () async {
await FlutterActivity.launch(
'com.example.your_app.MyActivity',
);
},
child: Text('Launch Activity'),
);
4. 传递数据到Activity
你可以通过FlutterActivity.launch
方法传递数据到Activity:
ElevatedButton(
onPressed: () async {
await FlutterActivity.launch(
'com.example.your_app.MyActivity',
arguments: {
'key1': 'value1',
'key2': 'value2',
},
);
},
child: Text('Launch Activity with Arguments'),
);
在Activity中,你可以通过getIntent()
方法获取这些数据:
Bundle extras = getIntent().getExtras();
if (extras != null) {
String value1 = extras.getString("key1");
String value2 = extras.getString("key2");
}
5. 从Activity返回数据
如果你想从Activity返回数据到Flutter,可以在Activity中使用setResult
方法:
Intent returnIntent = new Intent();
returnIntent.putExtra("resultKey", "resultValue");
setResult(RESULT_OK, returnIntent);
finish();
在Flutter中,你可以通过FlutterActivity.launchForResult
方法来接收返回的数据:
ElevatedButton(
onPressed: () async {
final result = await FlutterActivity.launchForResult(
'com.example.your_app.MyActivity',
);
if (result != null) {
String resultValue = result['resultKey'];
print('Result: $resultValue');
}
},
child: Text('Launch Activity for Result'),
);