go_router
web_socket_channel
provider
http
mysql1
shared_preferences
hive
url_launcher
url_launcher_web
dio
path_provider
go_router
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
void main() {
final router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomePage(),
),
GoRoute(
path: '/detail/:id',
builder: (context, state) {
final id = state.params['id']!;
return DetailPage(id: id);
},
),
],
);
runApp(MyApp(router: router));
}
class MyApp extends StatelessWidget {
final GoRouter router;
const MyApp({super.key, required this.router});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: router,
);
}
}
GoRouter
:ルート定義GoRoute
:パスと個別の画面(builder
)を設定state.params
:URLパラメータの取得MaterialApp.router
:アプリ側で使うgo()
:プログラムから指定パスに遷移
GoRouter.of(context).go('/detail/42');
push()
pop()
:画面戻る
context.pop(); // Navigator.pop() と同じ
web_socket_channel
import 'package:web_socket_channel/web_socket_channel.dart';
void main() {
final channel = WebSocketChannel.connect(
Uri.parse('wss://echo.websocket.org'), // WebSocketサーバーのURL
);
// サーバーからのメッセージを受け取る
channel.stream.listen((message) {
print('受信: $message');
});
// サーバーにメッセージを送る
channel.sink.add('Hello WebSocket');
// 通信終了
channel.sink.close();
}
WebSocketChannel.connect
:接続を作るchannel.stream.listen
:受信を監視channel.sink.add
:送信channel.sink.close
:接続を閉じるwss://
:暗号化ws:/
:非暗号化stream.listen
):データが来たら順次処理されるprovider
http
GET
:データを取得POST
:データを新しく作るPUT
:データを更新するDELETE
:データを削除する200
:成功400
:リクエストが間違っている401
:認証が必要404
:存在しないページ500
:サーバー側のエラーFuture
ベースで動く)Future
とasync
/await
を使ってレスポンスを待つimport 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://jsonplaceholder.typicode.com/todos/1');
// 非同期通信
final response = await http.get(url);
print(response.statusCode); // 200
print(response.body); // レスポンスの内容
}
async
await
:レスポンスが返ってくるまで待つFuture
:あとで値が返ってくるfinal url = Uri.parse('https://jsonplaceholder.typicode.com/todos/1');
final response = await http.get(url);
if (response.statusCode == 200) {
print('成功!レスポンス: ${response.body}');
} else {
print('エラー: ${response.statusCode}');
}
Uri.parse
:URLを作るhttp.get
:リクエストbody
とstatuscode
を確認import 'dart:convert'; // JSON変換用
final url = Uri.parse('https://jsonplaceholder.typicode.com/posts');
final response = await http.post(
url,
headers: {'Content-Type': 'application/json'},
body: jsonEncode({'title': 'Hello', 'body': 'World'}),
);
print(response.statusCode);
print(response.body);
headers
:
Content-type: application/json
body
:送るデータを書き込む(文字列やJSON)Map
、List
としてアクセスできるmysql1
import 'package:mysql1/mysql1.dart';
void main() async {
// 接続設定
final settings = ConnectionSettings(
host: 'localhost',
port: 3306,
user: 'user',
password: 'password',
db: 'test_db',
);
// 接続
final conn = await MySqlConnection.connect(settings);
// クエリ実行
var results = await conn.query('SELECT id, name FROM users WHERE id = ?', [1]);
for (var row in results) {
print('ID: ${row[0]}, Name: ${row[1]}');
}
// 接続を閉じる
await conn.close();
}
ConnectionSettings
(ホスト、ユーザー、パスワード、DBを指定)MysqlConnection.connect(settings)
conn.query(...)
:SQLクエリを実行Results
オブジェクトで返るawait
で待つ必要があるconn.close()
?
プレースホルダー:配列で値を渡すshared_preferences
import 'package:shared_preferences/shared_preferences.dart';
データを保存(set)
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', 'user123');
await prefs.setInt('age', 25);
await prefs.setBool('isLoggedIn', true);
final prefs = await SharedPreferences.getInstance();
String? username = prefs.getString('username');
int? age = prefs.getInt('age');
bool? isLoggedIn = prefs.getBool('isLoggedIn');
null
になるため、?
がついているawait prefs.remove('username'); // 特定のキーを削除
await prefs.clear(); // すべてのキーを削除
class LoginViewModel {
Future<void> saveLoginState(bool isLoggedIn) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isLoggedIn', isLoggedIn);
}
Future<bool> isUserLoggedIn() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getBool('isLoggedIn') ?? false;
}
Future<void> logout() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('isLoggedIn');
}
}
SharedPreferences.getInstance()
は非同期なので、必ずawait
が必要そのままでは保存できないので、JSON文字列化して保存する
import 'dart:convert';
final prefs = await SharedPreferences.getInstance();
List<String> items = ['apple', 'banana', 'cherry'];
// 保存
await prefs.setString('items', jsonEncode(items));
// 取得
String? data = prefs.getString('items');
if (data != null) {
List<String> restored = List<String>.from(jsonDecode(data));
print(restored); // ['apple', 'banana', 'cherry']
}
hive
Hive
url_launcher
import 'package:url_launcher/url_launcher.dart';
final Uri _url = Uri.parse("https://flutter.dev");
Future<void> openFlutterSite() async {
if (await canLaunchUrl(_url)) {
await launchUrl(_url);
} else {
throw '開けません: $_url';
}
}
Uri.parse(https://example.com)
:URLを指定launchUrl(url)
:指定されたURLを開くcanLaunchUrl
:失敗時の処理を書くことができるLaunchMode
LaunchMode.platformDefault
:OSが標準で決めた方法で開く(デフォルト)LaunchMode.externalApplication
:端末の外部ブラウザやアプリで開くLaunchMode.inAppWebView
:
WebView
、iOSはSFSafariViewController
が内部で使われるLaunchMode.externalNonBrowserApplication
:ブラウザ以外のアプリ(電話、メールなど)で開く場合に使うawait launchUrl(
_url,
mode: LaunchMode.inAppWebView, // アプリ内で表示
);
url_launcher_web
url_launcher
のWeb用の実装パッケージurl_launcher
をimport
すると自動的に内部で利用されるdio
http
の高機能版path_provider
import 'package:path_provider/path_provider.dart';
import 'dart:io';
void main() async {
// ドキュメントディレクトリの取得
final directory = await getApplicationDocumentsDirectory();
print('Documents directory: ${directory.path}');
// 一時ディレクトリの取得
final tempDir = await getTemporaryDirectory();
print('Temporary directory: ${tempDir.path}');
// ファイル作成例
final file = File('${directory.path}/example.txt');
await file.writeAsString('Hello, Path Provider!');
print(await file.readAsString());
}
getApplicationDocumentDirectory()
:永続的に保存できるディレクトリの取得getTemporaryDirectory()
:一時的に保存するディレクトリの取得dart:io
のFile
で読み書き