開発中に遭遇する1つの問題は、例えば、次のビュー:
class _PageState extends State<_HomePage> {
final _controller = PageController(initialPage: 0, keepPage: true);
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
controller: _controller,
physics: NeverScrollableScrollPhysics(),
children: <Widget>[
Container(color: Colors.redAccent,),
Container(color: Colors.blueAccent,),
],
),
);
}
}
PageView
Androidの同等のViewPager
呼び出しませんPageController.jumpToPage(index)
何ら問題は、特定のページへの定期スライド;しかし、以下のフォームに子供のページビュー:
children: <Widget>[
Builder(builder: (ctx) {
print('jumptTo111');
return Container(color: Colors.redAccent,);
},),
Container(color: Colors.blueAccent,),
],
最初のページのプリントを見つけるために、各スワイプはjumptTo111
、問題がここにあります:ビルダービルダー方法を意味し、ビルドプロセス中に呼び出されたWidget.build(BuildContext)
呼び出される、ため、Container(color: Colors.redAccent,)
再構築(そのノートBuilder
オブジェクトが再構築されませんが)。するにはBuilder
、別のコントロールに置き換えることが、あまりにも、キーは、制御対象になります。この方法を構築することです。
これは、我々が期待したものではありません!PageView
すべてのスライドは、必然的にパフォーマンスの問題につながるページを再構築する必要がある場合、一般的に、より大きなコンテナのルートページです!この場合のように、私たちは、必ずしもページを再作成する必要はありません。明らかにしなければならないので、少しピットだったPageController
セットアップkeepPage: true
プロパティをしても、そんなに悪いですか?!常にv1.8.0再建のフラッターに、とにかく、バグ制御とみなされない場合、私は知りません。唯一の後に徹底的に理解しなかったkeepPage
、このプロパティは、最初の数ページ、およびその関係が我々の意図ではないということです覚えておくことは、スライドの後に再建された平均ビューを表します。。。
リストビューは、後で同様の問題が見つかりました:それは受信IndexedWidgetBuilder itemBuilder
ビュー項目のリストを作成するためのパラメータを。あなたは100から100までの項目1のリストを持っている場合は1つの何ら問題はスライドしない、その後、100から1をスライドさせるか、項目のリストを表示し、再構築。あなたはどのようにできる項目の一覧を表示したい場合は、データが変更されていない、と私たちは確かにビューを作成するために、行きたくない、リストビューは、すべてのインターフェイスの開発ビューコントロールの最も重要なものの一つである限り、それは永続的なものとして、いくつかのケースでは良いビューオブジェクトを作成します。ソリューション。。。
どのような理論、効果が今必要とされている住民の図であり、すぐに見つかったKeepAlive
とAutomaticKeepAlive
コントロール、しかし不可解は、これら2つのコントロールは、先祖ノードを宣言しなければならないということですSliverWithKeepAliveWidget
、それ以外の場合は崩壊。幸いなことに、私が見つけた記事を、コアの意味はStatefulWidgetオブジェクトの状態で混合されるAutomaticKeepAliveClientMixin
ような形、これは永久的なビューの目的を達成することができます
class _PageState extends State<_HomePage> with AutomaticKeepAliveClientMixin<_HomePage> {
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context);
return Scaffold(...
);
}
}
しかし、我々は確かにしこりが直接キープアライブなどのコントロールとして使用することができることが最善のパッケージが命名に費やされているように、正常に接続されたロジックを開発する必要はありませんAliveKeeper
ので、そこに、それを
import 'package:flutter/widgets.dart';
class AliveKeeper extends StatefulWidget {
final Widget child;
const AliveKeeper({Key key, @required this.child}) : super(key: key);
@override
State<StatefulWidget> createState() => _AliveState();
}
class _AliveState extends State<AliveKeeper>
with AutomaticKeepAliveClientMixin<AliveKeeper> {
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context);
return widget.child;
}
}
変化に対応します:
children: <Widget>[
AliveKeeper(child: Builder(builder: (ctx) {
print('jumptTo111');
return Container(color: Colors.redAccent,);
},),),
Container(color: Colors.blueAccent,),
],
ビルダー方法はもはや本当に呼ばれていない、と私たちが必要とするまさにそのようなコンパクトで機能的な制御されています -
オブジェクトが常駐下の状況を表示する必要がある間、我々は区別しなければならないので、このアプローチは確かに、すべてに適合していません。もう一つの心配開発はフラッタープロセスは、コントロールと非常に精通している必要がありますあり、または注意を払っていないコントロールと少し間違っているが、ビューの再構築につながることができ、多くの場合、位置を標的とすることはよくないです!