flutter_ioe_sdk 1.0.0 copy "flutter_ioe_sdk: ^1.0.0" to clipboard
flutter_ioe_sdk: ^1.0.0 copied to clipboard

Flutter ioe sdk

example/lib/main.dart

import 'package:audioplayers/audioplayers.dart';
import 'package:example/resources/app_dimens.dart';
import 'package:example/widgets/item_score_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_ioe_sdk/domain/model/reponse/stop_record_response_model.dart';
import 'package:flutter_ioe_sdk/manager/evaluate_pronunciation_record_callback.dart';
import 'package:flutter_ioe_sdk/manager/ftech_ioe_sdk_manager.dart';
import 'package:flutter_ioe_sdk/manager/init_sdk_callback.dart';

void main() {
  FIOESdkManager.init();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: HomePage(),
    );
  }
}

class ButtonTestWidget extends StatelessWidget {
  const ButtonTestWidget({super.key, required this.label, required this.onTapButton});

  final String label;
  final GestureTapCallback onTapButton;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: onTapButton,
      child: Ink(
        color: Colors.black12,
        padding: const EdgeInsets.symmetric(horizontal: AppDimens.dimen_16, vertical: AppDimens.dimen_8),
        child: Text(label),
      ),
    );
  }
}

class HomePage extends HookWidget {
  HomePage({super.key});

  final AudioPlayer _audioPlayer = AudioPlayer();

  @override
  Widget build(BuildContext context) {
    final stateRecord = useState(const StopRecordResponseModel());
    final statusRecord = useState('');
    FIOESdkManager.registerRecordingListener(IFtechRecordingCallback(
        onStart: () {
          statusRecord.value = 'Recording....';
          stateRecord.value = const StopRecordResponseModel();
        },
        onRecording: () {},
        onFail: (error) {
          statusRecord.value = 'Fail: $error';
        },
        onComplete: (response) {
          statusRecord.value = response.data?.minioLink ?? '';
          stateRecord.value = response;
          response.data?.scoreData?.wordsScoreDetail;
        }));
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme
            .of(context)
            .colorScheme
            .inversePrimary,
      ),
      body: Stack(alignment: Alignment.center, children: [
        Column(
          children: <Widget>[
            ButtonTestWidget(label: 'Click to Init', onTapButton:(){_initIOESdk(context);}),
            const SizedBox(height: AppDimens.dimen_12),
            ButtonTestWidget(label: 'Click to Start', onTapButton: _startRecord),
            const SizedBox(height: AppDimens.dimen_12),
            ButtonTestWidget(label: 'Click to Stop', onTapButton: _stopRecord),
            const SizedBox(height: AppDimens.dimen_16),
            Expanded(
                child: Wrap(
                  alignment: WrapAlignment.center,
                  direction: Axis.horizontal,
                  children: _generateItemWord(stateRecord.value.data?.scoreData?.wordsScoreDetail),
                )),
            Expanded(
                child: Column(
                  children: [
                    Wrap(
                      alignment: WrapAlignment.center,
                      direction: Axis.horizontal,
                      children: _generateItemIPAScore(stateRecord.value.data?.scoreData?.wordsScoreDetail),
                    ),
                    const SizedBox(height: AppDimens.dimen_16),
                    ButtonTestWidget(label: 'Play', onTapButton: () {
                      _playAudioPronunciation(stateRecord.value.data?.minioLink);
                    })
              ],
                )),
          ],
        ),
        Align(child: Text(statusRecord.value))
      ]),
    );
  }

  List<Widget> _generateItemIPAScore(List<WordsScoreDetail>? wordList) {
    final listIpa = <PhonemesScoreDetail>[];
    if (wordList == null || wordList.isEmpty) {
      return [];
    }
    for (var word in wordList) {
      word.phonemesScoreDetail?.forEach((ipa) {
        listIpa.add(ipa);
      });
    }
    return listIpa.map((itemIPA) => ItemScoreOfIPAPronunciation(ipaDetail: itemIPA)).toList();
  }

  List<Widget> _generateItemWord(List<WordsScoreDetail>? wordList) {
    return wordList
        ?.map((word) =>
        ItemScoreOfWordWidget(
          wordsScore: word,
        ))
        .toList() ??
        [];
  }

  void _initIOESdk(BuildContext context) {
    FIOESdkManager.initRecord(
        '100067',
        '0341311b733b965218182220a507a3bc',
        InitSdkCallback(onSuccess: () {
          ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
               content: Text('init success'),
          ));
        }, onError: (error) {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Text('init error $error'),
          ));
        }));
  }

  void _startRecord() {
    FIOESdkManager.startRecord(referenceText: 'start record', englishAccent: LanguageAccent.english);
  }

  void _stopRecord() {
    FIOESdkManager.stopRecord();
  }

  void _playAudioPronunciation(String? urlSource) async {
    if (urlSource == null || urlSource.isEmpty) return;
    await _audioPlayer.play(UrlSource(urlSource));
  }
}