注意
flutter入門者の体験談的ななにかの話。
好ましくない部分が多くあると思いますので真似、絶対駄目。
前提
関数を使いたい。
たまたま子ファイルに既に存在している。
別ファイルから関数を呼び出した事無い。
動きを見たいだけなので、あまりソースを書き換えずにひとまず動かしたい。
自分が詰まったところとか流れ
- classをグローバル(GlobalKey)にして、childKey.currentStateに続けて関数を呼び出せばいけるかな? < NG、currentStateがnull
- body:Child(key: childKey)って書いてあるけれど関数呼びたいだけだしな < 間違えの始まり
- Globalkeyを記述するのをmain.dartじゃないと駄目なのか? < NG、関係ない
- currentState?関数呼びたいのにState?? < 困惑
- N時間経過…。
- あ、widget経由的な?child.dartのChild Widgetにkeyを渡してを適当に呼び出す。 < 呼べた。
おわりに
InheritedWidgetとかproviderを使った方法の方がなんだか(たぶん断然)いいらしい。
サンプルソースを少し触っただけで、不明点が積み重なるのが怖かったので今回は触らなかったけれど、今度はそれぞれの書き方で書き直してみたい。
main.dartがBLoCでchild.dartがproviderみたいな書き方もできるのかな。
参考
ソース
main.dart
import 'child.dart'; //呼びたい子
/*
いろいろ削除されてます。
*/
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
childKey.currentState.callChild("message"); //呼びたい関数
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
Child(key: childKey), //なんでもいいからWidgetとして呼んでkey渡したる
],
),
),
);
}
}
child.dart
//特に省略していない
import 'package:flutter/material.dart';
GlobalKey<_ChildState> childKey = new GlobalKey<_ChildState>();
class Child extends StatefulWidget {
Child({Key key}) : super(key: key);
@override
_ChildState createState() => _ChildState();
}
class _ChildState extends State<Child> {
void callChild(String message) {
print(message);
}
@override
Widget build(BuildContext context) {
return new Container();
}
}