こんにちは。
Geminiを使った簡単なアプリを作ってみたので、ここにコードを残したいと思います。
環境
Flutter: 3.19.1 Dart: 3.3.0
pub.dev こちらのライブラリを使いました。
Api Kyeはここで作成します。 aistudio.google.com
実装
pubspec.yml
name: gemini_sample description: "A new Flutter project." # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 # followed by an optional build number separated by a +. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # In Android, build-name is used as versionName while build-number used as versionCode. # Read more about Android versioning at https://developer.android.com/studio/publish/versioning # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: sdk: '>=3.3.0 <4.0.0' # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions # consider running `flutter pub upgrade --major-versions`. Alternatively, # dependencies can be manually updated by changing the version numbers below to # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter google_generative_ai: ^0.2.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 dev_dependencies: flutter_test: sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^3.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages
main.dart
import 'package:flutter/material.dart'; import 'package:google_generative_ai/google_generative_ai.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Gemini Sample App'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final _controller = TextEditingController(); final _focus = FocusNode(); bool isLoading = false; final model = GenerativeModel( model: 'gemini-pro', apiKey: '作成したApi Key'); final List<String> answer = []; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Stack( children: [ ListView.separated( itemCount: answer.length, itemBuilder: (context, index) { return ListTile( title: Text(answer[index]), ); }, separatorBuilder: (context, index) { return const Divider(); }), if (isLoading) const Center( child: CircularProgressIndicator(), ), ], ), bottomSheet: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ Expanded( child: TextField( focusNode: _focus, controller: _controller, )), IconButton( onPressed: () { _focus.unfocus(); setState(() { isLoading = true; }); final content = [Content.text(_controller.text)]; model.generateContent(content).then((value) { setState(() { answer.add(value.text ?? ''); _controller.clear(); isLoading = false; }); }); }, icon: const Icon(Icons.send)), ], ), ), ); } }
ほぼReadme通りです! これで簡単にai chatが作れました。
プロンプトは「今夜の献立を一緒に考えて」と入れてみました。
お天気とか聞いてみたけど、そういうのは答えてくれませんでした。
そんな感じで簡単にchatができました。
何か面白いアプリ作れそうな気がしますね!