環境
標準のフラッター デモを使用して、ドロワーを追加しました。引き出しの内容を別のファイルの別のクラスに入れました。どちらもステートフル ウィジェットです。メイン画面に表示される数値のグローバル変数をインクリメントする setState を使用して、ドロワーでフローティング アクション ボタンを使用します。
何が起こるのですか
押しても何も起こりません。
メイン ページ/main.dart のフローティング アクション ボタンを使用するまで、メイン ページ/main.dart のテキストは更新されません。次に、ドロワーに追加したすべてのインクリメントも追加します。
したがって、ウィジェットを再構築するだけではありません。
ウィジェットを再構築するにはどうすればよいですか? 必要なのは、両方とも setstate 内にあることだけだと思いましたか?
私が思いついた最善の原因
ステートフル ウィジェット内でステートフル ウィジェットを使用しても、埋め込みウィジェットは技術的には main.dart で作成されたオブジェクトであるため、setstate は埋め込みステートフル ウィジェットでのみ機能するためですか?
main.dart のコード
import 'package:flutter/material.dart';
import 'drawer.dart';
DrawerClass _drawer = DrawerClass();
int counter = 0;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _incrementCounter() {
setState(() {
counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
endDrawer: SafeArea(child: Drawer(child: Container(child: _drawer,),)),
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.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
引き出しのコード
import 'package:flutter/material.dart';
import 'main.dart';
class DrawerClass extends StatefulWidget {
@override
_DrawerClassState createState() => _DrawerClassState();
}
class _DrawerClassState extends State<DrawerClass> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFF222831),
body: Container(
width: 100,
child: Center(
child: FloatingActionButton(
tooltip: 'Increment',
child: Icon(Icons.add),
onPressed: () {
setState(() {
counter++;
});
},
),
),
),
);
}
}