Bagaimana cara mengatur onPressed dengan benar di Flutter?

Saya menyetel "onPressed" untuk floatingActionButton di Flutter dan ini memberi saya kesalahan aneh meskipun saya melihat kode yang hampir sama berfungsi di tutorial...

Catatan : Tombol ini ada di widget scaffold...

Catatan : "konteks" adalah argumen dalam fungsi yang berisi widget scaffold

Catatan : saya mencoba menggunakan tombol timbul dan kesalahan yang sama terjadi

main.dart :

import 'package:flutter/material.dart';
import './pages/home.dart';

main(List<String> args) => runApp(HomePage());

home.dart :

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:english_words/english_words.dart';
import './item.dart';
import 'dart:math';
import './tabs/create.dart';
import './tabs/manage.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Color _mainColor = Colors.green;
  final List<Map<String, String>> mainList = [];
  List<IconData> iconsList = [
    Icons.add,
    Icons.add_alarm,
    Icons.adjust,
    Icons.all_inclusive,
    Icons.android,
    Icons.attach_money,
    Icons.audiotrack,
    Icons.battery_charging_full
  ];

  showTheDialog(BuildContext context) {
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Welcome to max!"),
            content: Text("We hope you enjoy our app :)"),
            actions: <Widget>[
              FlatButton(
                child: Text("Ok"),
                onPressed: () => setState(() {
                      _mainColor = Colors.lightGreen;
                    }),
              ),
              FlatButton(
                child: Text("Ok"),
                onPressed: () => setState(() {
                      _mainColor = Colors.lightGreen;
                    }),
              ),
            ],
          );
        });
  }

  Icon getRandomIcon() {
    Random randInt = Random();
    int randNum = randInt.nextInt(8);
    return Icon(
      iconsList[randNum],
      size: 35,
      color: _mainColor,
    );
  }

  Widget _buildListItem(BuildContext context, int index) {
    return Card(
        child: InkWell(
      onTap: () => Navigator.pushReplacement(context,
          MaterialPageRoute(builder: (BuildContext context) => Item())),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Text(
            WordPair.random().asCamelCase,
            style: TextStyle(
                fontSize: 25, fontWeight: FontWeight.bold, color: _mainColor),
          ),
        ],
      ),
    ));
  }

  Widget checkItems() {
    if (mainList.isEmpty) {
      return Center(
        child: Text(
          "There are no Items here",
          style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
        ),
      );
    } else {
      return ListView.builder(
        itemBuilder: _buildListItem,
        itemCount: mainList.length,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setSystemUIOverlayStyle(
        SystemUiOverlayStyle(statusBarColor: _mainColor));
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "Max Course",
        theme: ThemeData(
          primarySwatch: _mainColor,
        ),
        home: DefaultTabController(
          length: 4,
          child: Scaffold(
            appBar: AppBar(
              bottom: TabBar(
                tabs: <Widget>[
                  Tab(
                    text: "Create Item",
                    icon: Icon(Icons.create),
                  ),
                  Tab(
                    text: "Manage Item",
                    icon: Icon(Icons.list),
                  ),
                  Tab(
                    text: "Create Item",
                    icon: Icon(Icons.create),
                  ),
                  Tab(
                    text: "Manage Item",
                    icon: Icon(Icons.list),
                  )
                ],
              ),
              centerTitle: true,
              backgroundColor: _mainColor,
              title: Text(
                "Max",
                textDirection: TextDirection.ltr,
                style: TextStyle(
                  fontFamily: "Arciform",
                  fontWeight: FontWeight.w300,
                  fontSize: 25,
                ),
              ),
            ),
            body: TabBarView(
              children: <Widget>[
                CreateItems(),
                ManageItems(),
                CreateItems(),
                ManageItems(),
              ],
            ),
            floatingActionButton: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () => showTheDialog(context),
            ),
            drawer: Drawer(
              child: Center(
                child: FlatButton(
                  child: Text("test"),
                  onPressed: () => showTheDialog(context),
                ),
              ),
            ),
          ),
        ));
  }
}

buat.dart :

import 'package:flutter/material.dart';

class CreateItems extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        "Create Items..",
        style: TextStyle(
          fontWeight: FontWeight.bold,
          fontSize: 25,
        )
      )
    );
  }
}

kelola.dart :

import 'package:flutter/material.dart';

class ManageItems extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        "Manage Items..",
        style: TextStyle(
          fontWeight: FontWeight.bold,
          fontSize: 25,
        )
      )
    );
  }
}

kesalahannya adalah:

I/flutter (11665): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════ I/flutter (11665): The following assertion was thrown while handling a gesture: I/flutter (11665): No MaterialLocalizations found. I/flutter (11665): HomePage widgets require MaterialLocalizations to be provided by a Localizations widget ancestor. I/flutter (11665): Localizations are used to generate many different messages, labels,and abbreviations which are used I/flutter (11665): by the material library. I/flutter (11665): To introduce a MaterialLocalizations, either use a  MaterialApp at the root of your application to I/flutter (11665): include them automatically, or add a Localization widget with a MaterialLocalizations delegate. I/flutter (11665): The specific widget that could not find a MaterialLocalizations ancestor was: I/flutter (11665):   HomePage I/flutter (11665): The ancestors of this widget were: I/flutter (11665):   [root] I/flutter (11665): When the exception was thrown, this was the stack: I/flutter (11665): #0      debugCheckHasMaterialLocalizations.<anonymous closure> (package:flutter/src/material/debug.dart:124:7) I/flutter (11665): #1  debugCheckHasMaterialLocalizations (package:flutter/src/material/debug.dart:127:4) I/flutter (11665): #2  showDialog (package:flutter/src/material/dialog.dart:701:10) I/flutter (11665): #3      _HomePageState.showTheDialog (package:max/pages/home.dart:29:5) I/flutter (11665): #4     
_HomePageState.build.<anonymous closure> (package:max/pages/home.dart:154:30) I/flutter (11665): #5     
_InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:513:14) I/flutter (11665):
#6      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:568:30) I/flutter (11665):
#7      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24) I/flutter (11665): #8      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:246:9) I/flutter (11665): #9    TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7) I/flutter (11665): #10   PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:436:9) I/flutter (11665): #11     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12) I/flutter (11665): #12     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11) I/flutter (11665): #13    
_WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:214:19) I/flutter (11665):
#14     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:192:22) I/flutter (11665):
#15     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:149:7) I/flutter (11665):
#16     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7) I/flutter (11665):
#17     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7) I/flutter (11665):
#21     _invoke1 (dart:ui/hooks.dart:223:10) I/flutter (11665): #22     _dispatchPointerDataPacket (dart:ui/hooks.dart:144:5) I/flutter (11665): (elided 3 frames from package dart:async) I/flutter (11665): Handler: onTap I/flutter (11665): Recognizer: I/flutter (11665):   TapGestureRecognizer#b0516(debugOwner: GestureDetector, state: possible, won arena, finalPosition: I/flutter (11665):   Offset(299.0,
544.2), sent tap down) I/flutter (11665): ════════════════════════════════════════════════════════════════════════════════════════════════════ I/flutter (11665): Another exception was thrown: No MaterialLocalizations found.

person Michael Amir    schedule 01.04.2019    source sumber
comment
bisakah Anda menambahkan lebih banyak kode?   -  person diegoveloper    schedule 02.04.2019
comment
Membaca tumpukan, saya ragu kesalahannya ada pada kode yang Anda ajukan, karena ini tentang Lokalisasi. Lihat di log use a MaterialApp at the root of your application to   -  person TruongSinh    schedule 02.04.2019
comment
@diegoveloper saya telah mengedit postingan   -  person Michael Amir    schedule 02.04.2019
comment
@TruongSinh posting telah diedit   -  person Michael Amir    schedule 02.04.2019
comment
@diegoveloper jawaban Anda tidak berfungsi sama sekali, tidak ada yang terjadi ketika saya menambahkan pembuatnya   -  person Michael Amir    schedule 02.04.2019
comment
maaf saya salah, periksa jawaban saya yang diperbarui! tandai sebagai terselesaikan jika itu berhasil untuk Anda   -  person diegoveloper    schedule 02.04.2019
comment
@diegoveloper , sangat sangat bagus, sekarang berfungsi tetapi alangkah baiknya jika Anda memberikan tautan apa pun (artikel atau sesuatu) sehingga saya dapat memahami masalah dan solusinya   -  person Michael Amir    schedule 02.04.2019
comment
Itu karena buildContext yang Anda gunakan tidak berasal dari Material, jadi Anda memiliki dua opsi, gunakan Builder atau buat StatelessWidget (seperti saat Anda membuat proyek baru di flutter).   -  person diegoveloper    schedule 02.04.2019
comment
stackoverflow.com/questions/52088889/   -  person diegoveloper    schedule 02.04.2019
comment
@diegoveloper , terima kasih banyak :)   -  person Michael Amir    schedule 02.04.2019


Jawaban (1)


Coba gunakan widget Builder untuk mendapatkan BuildContext yang benar

             home: DefaultTabController(
                    length: 4,
                    child: Builder(
                      builder: (newContext) {
                        return Scaffold(
                          appBar: AppBar(
                            bottom: TabBar(
                              tabs: <Widget>[
                                Tab(
                                  text: "Create Item",
                                  icon: Icon(Icons.create),
                                ),
                                Tab(
                                  text: "Manage Item",
                                  icon: Icon(Icons.list),
                                ),
                                Tab(
                                  text: "Create Item",
                                  icon: Icon(Icons.create),
                                ),
                                Tab(
                                  text: "Manage Item",
                                  icon: Icon(Icons.list),
                                )
                              ],
                            ),
                            centerTitle: true,
                            backgroundColor: _mainColor,
                            title: Text(
                              "Max",
                              style: TextStyle(
                                fontFamily: "Arciform",
                                fontWeight: FontWeight.w300,
                                fontSize: 25,
                              ),
                            ),
                          ),
                          body: TabBarView(
                            children: <Widget>[
                     CreateItems(),
                     ManageItems(),
                     CreateItems(),
                     ManageItems(),],
                          ),
                          floatingActionButton: FloatingActionButton(
                            child: Icon(Icons.add),
                            onPressed: () => showTheDialog(newContext),
                          ),
                          drawer: Drawer(
                            child: Center(
                              child: FlatButton(
                                child: Text("test"),
                                onPressed: () => showTheDialog(newContext),
                              ),
                            ),
                          ),
                        );
                      },
                    ),
                  ),
person diegoveloper    schedule 02.04.2019