go_routerweb_socket_channelproviderhttpmysql1shared_preferenceshiveurl_launcherurl_launcher_webdiopath_providergo_routerimport '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_channelimport '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):データが来たら順次処理されるproviderhttpGET:データを取得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); // レスポンスの内容
}
asyncawait:レスポンスが返ってくるまで待つ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/jsonbody:送るデータを書き込む(文字列やJSON)Map、Listとしてアクセスできるmysql1import '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_preferencesimport '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']
}
hiveHiveurl_launcherimport '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:失敗時の処理を書くことができるLaunchModeLaunchMode.platformDefault:OSが標準で決めた方法で開く(デフォルト)LaunchMode.externalApplication:端末の外部ブラウザやアプリで開くLaunchMode.inAppWebView:
WebView、iOSはSFSafariViewControllerが内部で使われるLaunchMode.externalNonBrowserApplication:ブラウザ以外のアプリ(電話、メールなど)で開く場合に使うawait launchUrl(
_url,
mode: LaunchMode.inAppWebView, // アプリ内で表示
);
url_launcher_weburl_launcherのWeb用の実装パッケージurl_launcherをimportすると自動的に内部で利用されるdiohttpの高機能版path_providerimport '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で読み書き