flutter で、os 毎に処理を分岐するには?

import 'dart:io';

// ...

if (Platform.isAndroid) {
  // Android用の処理
} else if (Platform.isIOS) {
  // iOS用の処理
} else {
  // その他のプラットフォーム用の処理
}

wakelock ライブリをつかったらiOS だとエラーが発生して動作しなかった。

とりあえず必須でないので外す

2023-06-24 18:51:29.561174+0900 Runner[486:41614] Metal API Validation Enabled
2023-06-24 18:51:29.703009+0900 Runner[486:41614] [VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(35)] Using the Impeller rendering backend.
2023-06-24 18:51:30.255519+0900 Runner[486:41912] flutter: The Dart VM service is listening on http://127.0.0.1:58922/2zlyqqf60mY=/
2023-06-24 18:51:30.882812+0900 Runner[486:41614] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteData getBytes:range:]: range {14, 1} exceeds data length 14'
*** First throw call stack:
(0x1922a725c 0x1a603c480 0x1934e2e70 0x100c76d84 0x100c75744 0x100c76cc0 0x100c75744 0x100c76564 0x100c728d0 0x1006ccb80 0x102dc7ae8 0x102dc932c 0x102dd776c 0x192226298 0x1922206f8 0x19221f7d0 0x1a8961570 0x194b4c2d0 0x194b5184c 0x100209a80 0x191efe140)
libc++abi: terminating with uncaught exception of type NSException
(lldb)

 

https://developer.yahoo.co.jp/webapi/jlp/furigana/v2/furigana.html

https://developer.yahoo.co.jp/webapi/jlp/sample/sample10.html

 

yahoo さんの API で 漢字にルビを振ってくれるAPIがありこれを使ってみます。

Andorid Text to Speech が日本語だとかなりへんてこりんな読み方をするので、漢字にルビを振って利用します。

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<String>> getFurigana(String text, String appId) async {
  final apiUrl = Uri.parse('https://jlp.yahooapis.jp/FuriganaService/V2/furigana');

  final requestBody = jsonEncode({
    'id': '1',
    'jsonrpc': '2.0',
    'method': 'jlp.furiganaservice.furigana',
    'params': {
      'q': text,
      'grade' : 1
    },
  });

  final response = await http.post(apiUrl, headers: {'Content-Type': 'application/json', 'User-Agent': 'Yahoo AppID: $appId'},body: requestBody);
  // print(response.body);
  final jsonData = jsonDecode(response.body);
  final wordList = jsonData['result']['word'] as List<dynamic>;
  // print(wordList);

  List<String> textList = [];
  String _text = '';
  for (var word in wordList) {
    var singleWord = word.containsKey('furigana') ? word['furigana'] : word['surface'];
    _text +=  singleWord;
    print (_text);
    // 改行文字を比較
    if (singleWord == '\n') {
      textList.add(_text);
      _text = '';
    }
  }
  return textList;
}

void main() async {
  const appId = ''; // 自分のアプリケーションIDに置き換えてください
  const text = '''
私はケンです。
私は学生です。
私は旅行者です。
''';

  final furiganaText = await getFurigana(text, appId);
  print(furiganaText);
}
// 結果
[わたしはケンです。
, わたしはがくせいです。
, わたしはりょこうしゃです。
]

response の json がいまいち直感的でない感じでした。

ChatGPT さんに相談しながら作りました。

2週間程つかってみましたが、かなりよい

Unity より画面はつくりやすく、なれると Native よりも簡単に作れる。

Android Native のエンジニアとして、iOS も Android も同時で開発出来るのは脅威!

 

以下は、wakelock ライブラリ使用時のエラー

 

flutter build エラー

FAILURE: Build failed with an exception.

* What went wrong:
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
The following dependencies do not satisfy the required version:
project ‘:wakelock’ -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50

 

Flutter plugins/wakelock-0.4.0/build.gradle

buildscript {
    // ext.kotlin_version = '1.3.50'
    ext.kotlin_version = '1.7.10'

ext.kotlin_version = ‘1.7.10’ へ変更

© 2024 Falco Tech Blog Suffusion theme by Sayontan Sinha