0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

flutterで子ファイルの関数を呼び出したいだけだったんだ…。

Last updated at Posted at 2020-03-21

注意

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();
  }
}
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?