メソッドはクラスの中で作成するものだと思います。
setStateは状態(state)を持つクラスの中でのみ使えるはずなので、別ファイルでsetStateを含むメソッドを記述していたとしても、流用することは難しいと考えます。
以上を前提に、3つほどsetStateを活用したパターンを作ってみました。
①メソッド切り出しパターン
②クラスとしてcomponentを分割するパターン
③setStateの中で、関数の戻り値を応用するパターン
印象としては②が一般的かと思います。可読性もよく、パフォーマンスも優れていると思います。
home_screen.dart
dart
1import 'package:flutter/material.dart';
2import 'package:method_test_app/component.dart';
3import 'utilities.dart';
4
5class HomeScreen extends StatefulWidget {
6 @override
7 _HomeScreenState createState() => _HomeScreenState();
8}
9
10class _HomeScreenState extends State<HomeScreen> {
11 String _message;
12
13 @override
14 void initState() {
15 // TODO: implement initState
16 super.initState();
17 _message = "";
18 }
19
20 @override
21 Widget build(BuildContext context) {
22
23 return Scaffold(
24 appBar: AppBar(
25 title: Text("テスト"),
26 ),
27 body: Center(
28 child: Padding(
29 padding: const EdgeInsets.all(20.0),
30 child: Column(
31 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
32 children: [
33 //メソッドとして切り出しパターン
34 SizedBox(
35 width: double.infinity,
36 child: RaisedButton(
37 color: Colors.brown,
38 onPressed: () => sayHallo(),
39 child: Text("Function A"),
40 ),
41 ),
42 //クラスとして別ファイルに切り出すパターン
43 ReusableButton(
44 color: Colors.brown,
45 onPressed: () {
46 setState(() {
47 _message = "ありがとう";
48 });
49 },
50 ),
51 //関数を別ファイルに切り出すパターン
52 SizedBox(
53 width: double.infinity,
54 child: RaisedButton(
55 color: Colors.brown,
56 onPressed: () {
57 setState(() {
58 _message = editMessage(message: _message);
59 });
60 },
61 child: Text("Function C"),
62 ),
63 ),
64 Text(_message)
65 ],
66 ),
67 ),
68 ),
69 );
70 }
71
72 //メソッドとして切り出しパターン(続き)
73 sayHallo() {
74 setState(() {
75 print("テスト");
76 _message = "こんにちわ";
77 });
78 }
79}
80
components.dart
新しくReusableButtonを作成しています。その中で、VoidCallback(戻り値のないタイプの関数)を変数として組み込んでいます。
dart
1import 'package:flutter/material.dart';
2
3class ReusableButton extends StatelessWidget {
4 final VoidCallback onPressed;
5 final Color color;
6
7 ReusableButton({@required this.onPressed, this.color});
8
9 @override
10 Widget build(BuildContext context) {
11 return SizedBox(
12 width: double.infinity,
13 child: RaisedButton(
14 onPressed: onPressed, color: color, child: Text("Function B")),
15 );
16 }
17}
18
utilities.dart
変数messageの内容を引数として受け取り、String型の戻り値を返しています。
dart
1import 'package:flutter/material.dart';
2
3String editMessage({@required String message}) {
4 return "太郎くん${message}";
5}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/02 10:48