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

1 回复

更多关于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'),
);
回到顶部