view_model 0.1.2 copy "view_model: ^0.1.2" to clipboard
view_model: ^0.1.2 copied to clipboard

discontinued
outdatedDart 1 only

MVVM Pattern

example/lib/main.dart

import 'dart:async';

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

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  final ViewModelFactory factory = MyViewModelFactory();

  @override
  Widget build(BuildContext context) {
    return ViewModelProvider(
      factory: factory,
      child: buildApp(context),
    );
  }

  Widget buildApp(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

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

class _HomePageState extends State<HomePage> {
  HomeViewModel viewModel;

  @override
  Widget build(BuildContext context) {
    viewModel = ViewModelProvider.of(context).provide(HomeViewModel);
    return Scaffold(
      appBar: AppBar(
        title: Text('ViewModel test'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            StreamBuilder(
              stream: viewModel.clickStream,
              builder: (context, snapshot) =>
                  Text(snapshot.hasData ? '${snapshot.data}' : '0'),
            )
          ],
        ),
      ),
      floatingActionButton: ViewModel.newInheritedWidget(
          viewModel: viewModel,
          child: MyWidget()),
    );
  }

  @override
  void dispose() {
    viewModel.dispose();
    super.dispose();
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  HomeViewModel viewModel;

  @override
  Widget build(BuildContext context) {
    viewModel = ViewModel.of<HomeViewModel>(context);
//    ------------ or ------------
//    viewModel = ViewModelProvider.of(context).provide(HomeViewModel);
//    Provider ensures the singleton of the instance before it is destroyed
    return FloatingActionButton(
      onPressed: () {
        viewModel.increment();
      },
      tooltip: 'Increment',
      child: new Icon(Icons.add),
    );
  }
}

class HomeViewModel extends ViewModel {
  StreamController<int> _clickStreamController;
  Stream<int> clickStream;

  HomeViewModel(ViewModelProvider provider) : super(provider) {
    _clickStreamController = new StreamController<int>.broadcast();
    var counter = 0;
    clickStream = _clickStreamController.stream.map((val) {
      counter += val;
      return counter;
    });
  }

  void increment() {
    _clickStreamController.add(1);
  }

  @override
  void dispose() {
    // implement dispose
    super.dispose();
  }
}

class MyViewModelFactory extends ViewModelFactory {

  @override
  T crateViewModel<T extends ViewModel>(Type type, ViewModelProvider provider) {
    var vm;
    switch (type) {
      case HomeViewModel:
        vm = HomeViewModel(provider);
        break;
    }
    if (vm == null) throw Exception('Not implemented class $type');
    return vm;
  }

}
0
likes
0
pub points
0%
popularity

Publisher

unverified uploader

MVVM Pattern

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

flutter

More

Packages that depend on view_model