OpenFlutter / flutter_oktoast仅显示在主页上吗?

时间:2019-04-17 11:18:02

标签: dart flutter flutter-dependencies

我正在使用this库在我的应用中显示自定义吐司。我的应用程序中有多个页面。问题是,即使我从其他任何页面调用showToastWidget(...),吐司面包也出现在主页上。

主页

  @override
  Widget build(BuildContext context) {
    return OKToast(
      child: Scaffold(
        backgroundColor: Theme.of(context).accentColor,
        body: Center(
          child: SizedBox(
            height: 50,
            width: 50,
            child: Image(image: AssetImage('assets/ic_logo.png')),
          ),
        ),
      ),
    );
  }

第2页

@override
  Widget build(BuildContext context) {
    return OKToast(
      child: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: Text('Reset Password'),
        ),
        body: Center(
          child: Padding(
            padding: EdgeInsets.all(20),
            child: FlatButton(
              onPressed: () {
                showToastWidget(
                  Text('Hello. I am Toast!!!'),
                  duration: Duration(seconds: 2),
                );
              },
              child: Text('Show'),
            ),
          ),
        ),
      ),
    );
  }

当我从此页面呼叫showToastWidget(...)时,它会显示在主页上

编辑1 当我将上下文传递到showToastWidget()

时,出现此异常
I/flutter (24327): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter (24327): The getter 'position' was called on null.
I/flutter (24327): Receiver: null
I/flutter (24327): Tried calling: position
I/flutter (24327): 
I/flutter (24327): When the exception was thrown, this was the stack:
I/flutter (24327): #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter (24327): #1      showToastWidget (package:oktoast/src/toast.dart:210:40)

2 个答案:

答案 0 :(得分:1)

看起来OKToast库在同一应用程序中不支持多个OKToast小部件。您将必须将整个应用包装在OKToast小部件中,并提供完整示例:

import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';

void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return OKToast(
      child: MaterialApp(
        home: MainPage(),
      ),
    );
  }
}

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).accentColor,
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            FlatButton(
              child: Text("Show"),
              onPressed: () {
                showToast(
                  "Main Page toast",
                  duration: Duration(seconds: 2),
                );
              },
            ),
            SizedBox(height: 12.0),
            FlatButton(
              child: Text("Go to next page"),
              onPressed: () => _goToNextPage(context),
            ),
          ],
        ),
      ),
    );
  }

  void _goToNextPage(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => SecondPage(),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("Second Page"),
      ),
      body: Center(
        child: Padding(
          padding: EdgeInsets.all(20),
          child: FlatButton(
            onPressed: () {
              showToast(
                "Second Page toast",
                duration: Duration(seconds: 2),
              );
            },
            child: Text('Show'),
          ),
        ),
      ),
    );
  }
}

答案 1 :(得分:0)

我是OKToast的作者,很高兴您使用此库。

此Toast技巧基于移动端android中Toast的设计。 OKToast本身的灵感来自吐司,因此不可避免地会受到影响,而无法适应单个页面级Toast。

如果您需要页面级的OKToast组件,则可能需要这样做:

import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:simple_widget/simple_widget.dart';

class CategoryPage extends StatefulWidget {
  @override
  _CategoryPageState createState() => _CategoryPageState();
}

class _CategoryPageState extends State<CategoryPage> {
  @override
  Widget build(BuildContext context) {
    return OKToast(
      child: SimpleScaffold(
        title: "CategoryPage",
        actions: <Widget>[
          Builder(
            builder: (ctx) => IconButton(
                  icon: Icon(Icons.trip_origin),
                  onPressed: () {
                    showToast("page toast", context: ctx); // use context to show toast in the page-level OKToast.
                  },
                ),
          ),
        ],
        child: Container(),
      ),
    );
  }

}